厉害的网站开发,网站官网认证怎么做,在线文字图片生成器,做手机网站多少钱一、装饰器模式 概述 装饰器模式#xff08;Decorator Pattern#xff09;允许向一个现有的对象添加新的功能#xff0c;同时又不改变其结构。这种类型的设计模式属于结构型模式#xff0c;它是作为现有的类的一个包装
装饰器模式通过将对象包装在装饰器类中#xff0c;以…一、装饰器模式 概述 装饰器模式Decorator Pattern允许向一个现有的对象添加新的功能同时又不改变其结构。这种类型的设计模式属于结构型模式它是作为现有的类的一个包装
装饰器模式通过将对象包装在装饰器类中以便动态地修改其行为
主要解决一般的我们为了扩展一个类经常使用继承方式实现由于继承为类引入静态特征并且随着扩展功能的增多子类会很膨胀
何时使用在不想增加很多子类的情况下扩展类 优缺点 优点
装饰类和被装饰类可以独立发展不会相互耦合装饰模式是继承的一个替代模式装饰模式可以动态扩展一个实现类的功能
缺点
多层装饰比较复杂
1. 各个角色介绍
1.1 抽象组件Component
定义了组合中所有对象的通用接口可以是抽象类或接口。它声明了用于访问和管理子组件的方法包括添加、删除、获取子组件等
1.2 具体组件Concrete Component
是被装饰的原始对象它定义了需要添加新功能的对象
1.3 抽象装饰器Decorator
继承自抽象组件它包含了一个抽象组件对象并定义了与抽象组件相同的接口同时可以通过组合方式持有其他装饰器对象
1.4 具体装饰器Concrete Decorator
实现了抽象装饰器的接口负责向抽象组件添加新的功能。具体装饰器通常会在调用原始对象的方法之前或之后执行自己的操作
2. UML图
将创建一个 Shape 接口和实现了 Shape 接口的实体类。然后创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator并把 Shape 对象作为它的实例变量。RedShapeDecorator 是实现了 ShapeDecorator 的实体类 3. 具体例子和代码 角色分配 Shape形状接口 Rectangle实现形状接口的长方形类Circle实现形状接口的圆形类 ShapeDecorator形状装饰器抽象类 RedShapeDecorator红色形状装饰器继承ShapeDecorator
3.1 抽象组件及其实现类
Shape
package com.vinjcent.prototype.decorator;/*** author vinjcent* description 形状接口* since 2024/3/15 16:23*/
public interface Shape {/*** 形状绘制动作*/void draw();}
Rectangle
package com.vinjcent.prototype.decorator;/*** author vinjcent* description 长方形* since 2024/3/15 16:26*/
public class Rectangle implements Shape {Overridepublic void draw() {System.out.println(Shape: Rectangle);}}
Circle
package com.vinjcent.prototype.decorator;/*** author vinjcent* description 圆形* since 2024/3/15 16:28*/
public class Circle implements Shape {Overridepublic void draw() {System.out.println(Shape: Circle);}}
3.2 抽象装饰器及其具体装饰器
ShapeDecorator
package com.vinjcent.prototype.decorator;/*** author vinjcent* description 形状装饰器* since 2024/3/15 16:30*/
public abstract class ShapeDecorator implements Shape {protected Shape decoratedShape;public ShapeDecorator(Shape decoratedShape) {this.decoratedShape decoratedShape;}public void draw() {decoratedShape.draw();}}
RedShapeDecorator
package com.vinjcent.prototype.decorator;/*** author vinjcent* description 红色形状装饰器* since 2024/3/15 16:32*/
public class RedShapeDecorator extends ShapeDecorator {public RedShapeDecorator(Shape decoratedShape) {super(decoratedShape);}Overridepublic void draw() {decoratedShape.draw();setRedBorder(decoratedShape);}private void setRedBorder(Shape decoratedShape) {System.out.println(Border Color: Red);}}
3.3 测试主函数
package com.vinjcent.prototype.decorator;/*** author vinjcent* description 装饰器模式* since 2024/3/15 16:39*/
public class Main {public static void main(String[] args) {Shape circle new Circle();// ShapeDecorator redCircle new RedShapeDecorator(new Circle());// ShapeDecorator redRectangle new RedShapeDecorator(new Rectangle());Shape redCircle new RedShapeDecorator(new Circle());Shape redRectangle new RedShapeDecorator(new Rectangle());System.out.println(Circle with normal border);circle.draw();System.out.println(\nCircle of red border);redCircle.draw();System.out.println(\nRectangle of red border);redRectangle.draw();}}
测试结果 4. 使用场景
动态增强功能使用装饰器模式可在运行时为对象灵活地增加额外功能。通过组合各种装饰器能够实现不同功能的组合而无需改变原始对象的代码避免继承的功能扩展当使用继承来增强对象功能时会导致类的层次结构过于复杂时考虑采用装饰器模式。通过组合而非继承来实现功能扩展避免了深层次和复杂的类继承结构维护对象的封装性若需为对象添加功能同时又不愿修改原始对象的代码或破坏其封装性可采用装饰器模式。该模式不改变原对象结构只是在其上方增添功能弹性组合多项功能若需为对象添加多项功能且这些功能可弹性组合则可采用装饰器模式。透过组合各种装饰器能够实现各种功能的组合而无需创建大量子类贯彻单一职责原则在需要将功能添加与原始对象实现分离以符合单一职责原则时可采用装饰器模式。每个装饰器类专注于一个特定功能这有助于使类的职责更加明确