From 503cdee2a00bbb10e7189eb55573c0179bb3b23d Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Sat, 1 Feb 2025 14:51:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=A3=85=E9=A5=B0=E8=80=85=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../设计模式/image-20250201105537485.png | Bin 0 -> 16980 bytes .../设计模式/image-20250201105612849.png | Bin 0 -> 20218 bytes .../设计模式/image-20250201135138918.png | Bin 0 -> 7312 bytes README/设计模式.md | 114 ++++++++++++++++++ .../src/main/java/cn/bunny/pattern2/Main.java | 1 - .../cn/bunny/pattern4/demo1/BasicCar.java | 8 ++ .../java/cn/bunny/pattern4/demo1/Car.java | 5 + .../cn/bunny/pattern4/demo1/CarDecorator.java | 14 +++ .../cn/bunny/pattern4/demo1/LuxuryCar.java | 14 +++ .../java/cn/bunny/pattern4/demo1/Main.java | 14 +++ .../cn/bunny/pattern4/demo1/SportsCar.java | 14 +++ .../pattern4/demo2/BeautyCameraDecorator.java | 16 +++ .../java/cn/bunny/pattern4/demo2/Camera.java | 9 ++ .../bunny/pattern4/demo2/CameraDecorator.java | 10 ++ .../pattern4/demo2/FilterCameraDecorator.java | 16 +++ .../java/cn/bunny/pattern4/demo2/Main.java | 20 +++ .../bunny/pattern4/demo2/TakePhotoCamera.java | 11 ++ 17 files changed, 265 insertions(+), 1 deletion(-) create mode 100644 README/images/设计模式/image-20250201105537485.png create mode 100644 README/images/设计模式/image-20250201105612849.png create mode 100644 README/images/设计模式/image-20250201135138918.png create mode 100644 pattern/src/main/java/cn/bunny/pattern4/demo1/BasicCar.java create mode 100644 pattern/src/main/java/cn/bunny/pattern4/demo1/Car.java create mode 100644 pattern/src/main/java/cn/bunny/pattern4/demo1/CarDecorator.java create mode 100644 pattern/src/main/java/cn/bunny/pattern4/demo1/LuxuryCar.java create mode 100644 pattern/src/main/java/cn/bunny/pattern4/demo1/Main.java create mode 100644 pattern/src/main/java/cn/bunny/pattern4/demo1/SportsCar.java create mode 100644 pattern/src/main/java/cn/bunny/pattern4/demo2/BeautyCameraDecorator.java create mode 100644 pattern/src/main/java/cn/bunny/pattern4/demo2/Camera.java create mode 100644 pattern/src/main/java/cn/bunny/pattern4/demo2/CameraDecorator.java create mode 100644 pattern/src/main/java/cn/bunny/pattern4/demo2/FilterCameraDecorator.java create mode 100644 pattern/src/main/java/cn/bunny/pattern4/demo2/Main.java create mode 100644 pattern/src/main/java/cn/bunny/pattern4/demo2/TakePhotoCamera.java diff --git a/README/images/设计模式/image-20250201105537485.png b/README/images/设计模式/image-20250201105537485.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa10c200adfae696589e7b3c0a92ff5e02b5d46 GIT binary patch literal 16980 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 literal 0 HcmV?d00001 diff --git a/README/images/设计模式/image-20250201105612849.png b/README/images/设计模式/image-20250201105612849.png new file mode 100644 index 0000000000000000000000000000000000000000..ab7a3d5f4186d9f203cb16b1271ab9dcbf064f07 GIT binary patch literal 20218 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 Ih($ literal 0 HcmV?d00001 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("拍照。。。"); + } +}