做图有什么网站,网站备案的具体流程,仿做静态网站多少钱,中铁建设集团门户网站类型#xff1a;结构型模式
实现原理#xff1a;装饰器模式通过将对象包装在装饰器类中#xff0c;并在保持类方法签名完整性的前提下#xff0c;提供额外功能
作用#xff1a;动态地给一个对象添加一些额外的职责。增加功能方面#xff0c;装饰器模式比生成子类更灵活…类型结构型模式
实现原理装饰器模式通过将对象包装在装饰器类中并在保持类方法签名完整性的前提下提供额外功能
作用动态地给一个对象添加一些额外的职责。增加功能方面装饰器模式比生成子类更灵活。
解决的问题为了扩展类使用继承方式引入静态特征而随着扩展功能的增多子类发生膨胀。
何时使用在不想增加很多子类的情况下扩展类。
解决方法划分具体功能职责并继承装饰者模式。
关键代码1、Component 类充当抽象角色不应该具体实现。 2、修饰类引用和继承 Component 类具体扩展类重写父类方法。
应用实例1、孙悟空有 72 变当他变成庙宇后他的根本还是一只猴子但是他又有了庙宇的功能。 2、不论一幅画有没有画框都可以挂在墙上但是通常都是有画框的并且实际上是画框被挂在墙上。在挂在墙上之前画可以被蒙上玻璃装到框子里这时画、玻璃和画框形成了一个物体。
优点装饰类和被装饰类各自独立
缺点多层装饰比较复杂。
使用场景 1、扩展一个类的功能。 2、动态增加功能动态撤销。
装饰器模式包含以下几个核心角色
抽象组件Component定义了原始对象和装饰器对象的公共接口或抽象类可以是具体组件类的父类或接口。具体组件Concrete Component是被装饰的原始对象它定义了需要添加新功能的对象。抽象装饰器Decorator继承自抽象组件它包含了一个抽象组件对象并定义了与抽象组件相同的接口同时可以通过组合方式持有其他装饰器对象。具体装饰器Concrete Decorator实现了抽象装饰器的接口负责向抽象组件添加新的功能。具体装饰器通常会在调用原始对象的方法之前或之后执行自己的操作。
装饰器模式通过嵌套包装多个装饰器对象可以实现多层次的功能增强。每个具体装饰器类都可以选择性地增加新的功能同时保持对象接口的一致性。
实现
步骤 1创建一个接口Shape.java
public interface Shape {void draw();
}
步骤 2创建实现接口的实体类。Rectangle.java
public class Rectangle implements Shape {Overridepublic void draw() {System.out.println(Shape: Rectangle);}
}
Circle.java
public class Circle implements Shape {Overridepublic void draw() {System.out.println(Shape: Circle);}
}
步骤 3创建实现了 Shape 接口的抽象装饰类。ShapeDecorator.java
public abstract class ShapeDecorator implements Shape {protected Shape decoratedShape;public ShapeDecorator(Shape decoratedShape){this.decoratedShape decoratedShape;}public void draw(){decoratedShape.draw();}
}
步骤 4创建扩展了 ShapeDecorator 类的实体装饰类。RedShapeDecorator.java
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);}
}
步骤 5使用 RedShapeDecorator 来装饰 Shape 对象。DecoratorPatternDemo.java
public class DecoratorPatternDemo {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();}
}
步骤 6执行程序输出结果Circle with normal borderShape: CircleCircle of red borderShape: CircleBorder Color: RedRectangle of red borderShape: RectangleBorder Color: Red这段代码实现了装饰器模式。首先创建了一个Shape接口该接口定义了一个绘制(draw)方法。然后创建了两个实现了Shape接口的具体类Rectangle和Circle它们分别实现了绘制方法用于绘制矩形和圆形。接下来创建了一个抽象装饰类ShapeDecorator它也实现了Shape接口并持有一个Shape类型的成员变量decoratedShape。该类的构造函数接受一个Shape对象作为参数用于装饰该对象。在绘制方法中首先调用被装饰对象的绘制方法然后执行额外的装饰操作。再次创建了一个扩展了ShapeDecorator的具体装饰类RedShapeDecorator。该类在绘制方法中除了调用被装饰对象的绘制方法外还添加了一个设置红色边框的操作。最后在主函数中创建了一个Circle对象和两个经过装饰的对象redCircle和redRectangle。通过调用各个对象的绘制方法可以看到装饰器模式的效果。原始的Circle对象只绘制了圆形而经过装饰的redCircle对象在绘制圆形之后还添加了红色边框的操作。执行程序后输出了三个对象的绘制结果。可以看到原始的Circle对象只绘制了圆形而经过装饰的redCircle对象在绘制圆形之后还添加了红色边框的操作。同样装饰了Rectangle对象的redRectangle对象也具有红色边框。这展示了装饰器模式的应用通过动态地添加额外的行为可以在不修改现有对象的情况下对其进行装饰和扩展。