feat: 装饰者模式
This commit is contained in:
parent
4b7d878e4e
commit
503cdee2a0
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
Binary file not shown.
After Width: | Height: | Size: 7.1 KiB |
114
README/设计模式.md
114
README/设计模式.md
|
@ -733,5 +733,119 @@ public class Main {
|
|||
|
||||
## 装饰者模式
|
||||
|
||||
装饰器模式是一种结构型设计模式,允许在不修改对象代码的前提下,动态地给一个对象添加额外的功能。它通过“包装”原始对象,使用一个或多个装饰器类对其功能进行增强或修改。
|
||||
|
||||
简单来说,装饰器模式通过“装饰”原有对象来扩展功能,而不是通过继承来修改对象的行为。
|
||||
|
||||
**汽车案例**
|
||||
|
||||
假设你有一辆普通的车(**基本功能**),如果你想让这辆车变成运动型车或豪华车(**添加新功能**),你可以将这辆车包装在不同的装饰器中。例如:
|
||||
|
||||
- **基本车**:一辆普通的车。
|
||||
- **运动型车**:在基本车上增加运动功能,比如加速性能、运动座椅等。
|
||||
- **豪华车**:在基本车上增加奢华功能,如高档内饰、音响系统等。
|
||||
|
||||
通过使用装饰器模式,你可以自由组合这些功能(运动型 + 豪华型),而不需要修改原有的 `Car` 类。
|
||||
|
||||
![image-20250201105537485](./images/设计模式/image-20250201105537485.png)
|
||||
|
||||
**相机案例**
|
||||
|
||||
![image-20250201105612849](./images/设计模式/image-20250201105612849.png)
|
||||
|
||||
### 装饰器模式的结构
|
||||
|
||||
1. **Component(组件接口)**:定义了被装饰对象的共同行为,通常是一个接口或抽象类。
|
||||
2. **ConcreteComponent(具体组件)**:实现了 `Component` 接口,表示被装饰的对象。
|
||||
3. **Decorator(装饰器)**:实现 `Component` 接口,并持有一个 `Component` 对象,目的是对其进行包装。
|
||||
4. **ConcreteDecorator(具体装饰器)**:扩展了 `Decorator` 类,为 `Component` 添加额外的功能。
|
||||
|
||||
#### 优点
|
||||
|
||||
1. **灵活性**:装饰器模式可以通过动态地组合多个装饰器来实现功能的拓展,而不需要修改现有类或创建大量的子类。
|
||||
2. **遵循开放-封闭原则**:类对扩展开放,对修改封闭。你可以通过装饰器添加新功能,而无需修改现有的类代码。
|
||||
3. **功能复用**:装饰器模式支持组合多个装饰器,通过不同的装饰器组合可以重用已有的功能。
|
||||
4. **避免类膨胀**:与继承不同,装饰器模式避免了大量的子类创建,能够更灵活地对对象功能进行增强。
|
||||
|
||||
#### 缺点
|
||||
|
||||
1. **增加复杂性**:由于需要创建多个装饰器类,系统的结构可能变得更加复杂,维护和理解装饰器链条可能变得较为困难。
|
||||
2. **多层装饰会导致性能开销**:装饰器模式通常会创建多个小对象进行嵌套包装,导致性能开销增加,尤其在装饰器链条很长时。
|
||||
3. **难以管理装饰器的组合**:如果装饰器有依赖关系或需要特定的顺序才能正确工作,那么组合多个装饰器可能会变得更加困难,增加了使用的难度。
|
||||
|
||||
### 相机
|
||||
|
||||
#### 相机接口
|
||||
|
||||
```java
|
||||
public interface Camera {
|
||||
|
||||
/**
|
||||
* 操作
|
||||
*/
|
||||
void operation();
|
||||
}
|
||||
```
|
||||
|
||||
#### 相机实现
|
||||
|
||||
```java
|
||||
public class TakePhotoCamera implements Camera {
|
||||
/**
|
||||
* 操作
|
||||
*/
|
||||
@Override
|
||||
public void operation() {
|
||||
System.out.println("拍照。。。");
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class CameraDecorator implements Camera {
|
||||
|
||||
final Camera camera;
|
||||
|
||||
public CameraDecorator(Camera camera) {
|
||||
this.camera = camera;
|
||||
}
|
||||
}
|
||||
|
||||
public class FilterCameraDecorator extends CameraDecorator {
|
||||
public FilterCameraDecorator(Camera camera) {
|
||||
super(camera);
|
||||
}
|
||||
|
||||
/**
|
||||
* 操作
|
||||
*/
|
||||
@Override
|
||||
public void operation() {
|
||||
camera.operation();
|
||||
System.out.println("滤镜功能。。。");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 运行
|
||||
|
||||
```java
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
System.out.println("------------------执行简单的拍照-------------------");
|
||||
|
||||
TakePhotoCamera takePhotoCamera = new TakePhotoCamera();
|
||||
takePhotoCamera.operation();
|
||||
|
||||
System.out.println("-------------------需要美颜功能------------------");
|
||||
|
||||
BeautyCameraDecorator beautyCameraDecorator = new BeautyCameraDecorator(takePhotoCamera);
|
||||
beautyCameraDecorator.operation();
|
||||
|
||||
System.out.println("-------------------需要美颜功能之后滤镜------------------");
|
||||
|
||||
FilterCameraDecorator filterCameraDecorator = new FilterCameraDecorator(beautyCameraDecorator);
|
||||
filterCameraDecorator.operation();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
![image-20250201135138918](./images/设计模式/image-20250201135138918.png)
|
||||
|
|
|
@ -11,7 +11,6 @@ public class Main {
|
|||
modelDuck.performFly();
|
||||
modelDuck.performQuack();
|
||||
modelDuck.swim();
|
||||
|
||||
System.out.println("--------------------------------");
|
||||
|
||||
AbstractDuck woodDuck = new WoodDuck();
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
package cn.bunny.pattern4.demo1;
|
||||
|
||||
public class BasicCar implements Car {
|
||||
@Override
|
||||
public void assemble() {
|
||||
System.out.println("Basic Car.");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
package cn.bunny.pattern4.demo1;
|
||||
|
||||
public interface Car {
|
||||
void assemble();
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package cn.bunny.pattern4.demo1;
|
||||
|
||||
public class CarDecorator implements Car {
|
||||
protected Car decoratedCar;
|
||||
|
||||
public CarDecorator(Car car) {
|
||||
this.decoratedCar = car;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void assemble() {
|
||||
this.decoratedCar.assemble();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package cn.bunny.pattern4.demo1;
|
||||
|
||||
public class LuxuryCar extends CarDecorator {
|
||||
|
||||
public LuxuryCar(Car car) {
|
||||
super(car);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void assemble() {
|
||||
super.assemble();
|
||||
System.out.println("Adding features of Luxury Car.");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package cn.bunny.pattern4.demo1;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Car sportsCar = new SportsCar(new BasicCar());
|
||||
sportsCar.assemble(); // 输出: Basic Car. Adding features of Sports Car.
|
||||
|
||||
System.out.println("\n*****");
|
||||
|
||||
Car sportsLuxuryCar = new SportsCar(new LuxuryCar(new BasicCar()));
|
||||
sportsLuxuryCar.assemble(); // 输出: Basic Car. Adding features of Luxury Car. Adding features of Sports Car.
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package cn.bunny.pattern4.demo1;
|
||||
|
||||
public class SportsCar extends CarDecorator {
|
||||
|
||||
public SportsCar(Car car) {
|
||||
super(car);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void assemble() {
|
||||
super.assemble();
|
||||
System.out.println("Adding features of Sports Car.");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package cn.bunny.pattern4.demo2;
|
||||
|
||||
public class BeautyCameraDecorator extends CameraDecorator {
|
||||
public BeautyCameraDecorator(Camera camera) {
|
||||
super(camera);
|
||||
}
|
||||
|
||||
/**
|
||||
* 操作
|
||||
*/
|
||||
@Override
|
||||
public void operation() {
|
||||
camera.operation();
|
||||
System.out.println("美颜功能相机。。。");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
package cn.bunny.pattern4.demo2;
|
||||
|
||||
public interface Camera {
|
||||
|
||||
/**
|
||||
* 操作
|
||||
*/
|
||||
void operation();
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
package cn.bunny.pattern4.demo2;
|
||||
|
||||
public abstract class CameraDecorator implements Camera {
|
||||
|
||||
final Camera camera;
|
||||
|
||||
public CameraDecorator(Camera camera) {
|
||||
this.camera = camera;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package cn.bunny.pattern4.demo2;
|
||||
|
||||
public class FilterCameraDecorator extends CameraDecorator {
|
||||
public FilterCameraDecorator(Camera camera) {
|
||||
super(camera);
|
||||
}
|
||||
|
||||
/**
|
||||
* 操作
|
||||
*/
|
||||
@Override
|
||||
public void operation() {
|
||||
camera.operation();
|
||||
System.out.println("滤镜功能。。。");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
package cn.bunny.pattern4.demo2;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
System.out.println("------------------执行简单的拍照-------------------");
|
||||
|
||||
TakePhotoCamera takePhotoCamera = new TakePhotoCamera();
|
||||
takePhotoCamera.operation();
|
||||
|
||||
System.out.println("-------------------需要美颜功能------------------");
|
||||
|
||||
BeautyCameraDecorator beautyCameraDecorator = new BeautyCameraDecorator(takePhotoCamera);
|
||||
beautyCameraDecorator.operation();
|
||||
|
||||
System.out.println("-------------------需要美颜功能之后滤镜------------------");
|
||||
|
||||
FilterCameraDecorator filterCameraDecorator = new FilterCameraDecorator(beautyCameraDecorator);
|
||||
filterCameraDecorator.operation();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
package cn.bunny.pattern4.demo2;
|
||||
|
||||
public class TakePhotoCamera implements Camera {
|
||||
/**
|
||||
* 操作
|
||||
*/
|
||||
@Override
|
||||
public void operation() {
|
||||
System.out.println("拍照。。。");
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue