diff --git a/README/images/设计模式/image-20250201105537485.png b/README/images/设计模式/image-20250201105537485.png new file mode 100644 index 0000000..eaa10c2 Binary files /dev/null and b/README/images/设计模式/image-20250201105537485.png differ diff --git a/README/images/设计模式/image-20250201105612849.png b/README/images/设计模式/image-20250201105612849.png new file mode 100644 index 0000000..ab7a3d5 Binary files /dev/null and b/README/images/设计模式/image-20250201105612849.png differ diff --git a/README/images/设计模式/image-20250201135138918.png b/README/images/设计模式/image-20250201135138918.png new file mode 100644 index 0000000..3b1bfc0 Binary files /dev/null and b/README/images/设计模式/image-20250201135138918.png differ diff --git a/README/设计模式.md b/README/设计模式.md index a599277..8f848f0 100644 --- a/README/设计模式.md +++ b/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) diff --git a/pattern/src/main/java/cn/bunny/pattern2/Main.java b/pattern/src/main/java/cn/bunny/pattern2/Main.java index 866a5aa..cb91c9b 100644 --- a/pattern/src/main/java/cn/bunny/pattern2/Main.java +++ b/pattern/src/main/java/cn/bunny/pattern2/Main.java @@ -11,7 +11,6 @@ public class Main { modelDuck.performFly(); modelDuck.performQuack(); modelDuck.swim(); - System.out.println("--------------------------------"); AbstractDuck woodDuck = new WoodDuck(); diff --git a/pattern/src/main/java/cn/bunny/pattern4/demo1/BasicCar.java b/pattern/src/main/java/cn/bunny/pattern4/demo1/BasicCar.java new file mode 100644 index 0000000..c5583d3 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern4/demo1/BasicCar.java @@ -0,0 +1,8 @@ +package cn.bunny.pattern4.demo1; + +public class BasicCar implements Car { + @Override + public void assemble() { + System.out.println("Basic Car."); + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern4/demo1/Car.java b/pattern/src/main/java/cn/bunny/pattern4/demo1/Car.java new file mode 100644 index 0000000..7574fcf --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern4/demo1/Car.java @@ -0,0 +1,5 @@ +package cn.bunny.pattern4.demo1; + +public interface Car { + void assemble(); +} diff --git a/pattern/src/main/java/cn/bunny/pattern4/demo1/CarDecorator.java b/pattern/src/main/java/cn/bunny/pattern4/demo1/CarDecorator.java new file mode 100644 index 0000000..2d2892f --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern4/demo1/CarDecorator.java @@ -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(); + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern4/demo1/LuxuryCar.java b/pattern/src/main/java/cn/bunny/pattern4/demo1/LuxuryCar.java new file mode 100644 index 0000000..b8936cb --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern4/demo1/LuxuryCar.java @@ -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."); + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern4/demo1/Main.java b/pattern/src/main/java/cn/bunny/pattern4/demo1/Main.java new file mode 100644 index 0000000..e5286f6 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern4/demo1/Main.java @@ -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. + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern4/demo1/SportsCar.java b/pattern/src/main/java/cn/bunny/pattern4/demo1/SportsCar.java new file mode 100644 index 0000000..92d7b11 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern4/demo1/SportsCar.java @@ -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."); + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern4/demo2/BeautyCameraDecorator.java b/pattern/src/main/java/cn/bunny/pattern4/demo2/BeautyCameraDecorator.java new file mode 100644 index 0000000..94798f9 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern4/demo2/BeautyCameraDecorator.java @@ -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("美颜功能相机。。。"); + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern4/demo2/Camera.java b/pattern/src/main/java/cn/bunny/pattern4/demo2/Camera.java new file mode 100644 index 0000000..18ba080 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern4/demo2/Camera.java @@ -0,0 +1,9 @@ +package cn.bunny.pattern4.demo2; + +public interface Camera { + + /** + * 操作 + */ + void operation(); +} diff --git a/pattern/src/main/java/cn/bunny/pattern4/demo2/CameraDecorator.java b/pattern/src/main/java/cn/bunny/pattern4/demo2/CameraDecorator.java new file mode 100644 index 0000000..914abe4 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern4/demo2/CameraDecorator.java @@ -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; + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern4/demo2/FilterCameraDecorator.java b/pattern/src/main/java/cn/bunny/pattern4/demo2/FilterCameraDecorator.java new file mode 100644 index 0000000..9683bb1 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern4/demo2/FilterCameraDecorator.java @@ -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("滤镜功能。。。"); + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern4/demo2/Main.java b/pattern/src/main/java/cn/bunny/pattern4/demo2/Main.java new file mode 100644 index 0000000..e68c1bc --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern4/demo2/Main.java @@ -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(); + } +} diff --git a/pattern/src/main/java/cn/bunny/pattern4/demo2/TakePhotoCamera.java b/pattern/src/main/java/cn/bunny/pattern4/demo2/TakePhotoCamera.java new file mode 100644 index 0000000..b818e83 --- /dev/null +++ b/pattern/src/main/java/cn/bunny/pattern4/demo2/TakePhotoCamera.java @@ -0,0 +1,11 @@ +package cn.bunny.pattern4.demo2; + +public class TakePhotoCamera implements Camera { + /** + * 操作 + */ + @Override + public void operation() { + System.out.println("拍照。。。"); + } +}