装饰器模式
·
允许向一个现有对象添加功能,又不改变其结构,,就和 IO 中的流一样。需要有一个接口,有多个接口的实现类。。。把这个装饰器写成抽象类,继承这个接口,,在里面传入接口实体对象,这样这个抽象装饰类的子类,就可以随意调用 接口具体子类的功能,还能在这个抽象装饰类的子类里面添加自己需要附加的功能,等于这个抽象装饰类子类,既可以用 接口实现类的功能又可以自己添加功能。。。在扩展一个类的功能时候可以使用,可以动态增加功能,动态撤销功能
public class Demo {
/*
* 装饰者模式(Decorator Pattern)
* 允许向一个现有的对象添加新的功能,同时又不改变其结构。
* 它是作为现有的类的一个包装
*
* 意图:
* 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更加灵活
* 何时使用:
* 在不想增加很多子类的情况下扩展类
* 如何解决:
* 将具体功能职责划分,同时继承装饰者模式
* 关键代码:
* 1, Component 类充当抽象角色,不应该具体实现
* 2,修饰类 引用和继承 Component 类,,具体扩展类重写父类方法
* 应用实例:
* 1,孙悟空有72变,当它变成“庙宇”后,它的根本还是一只猴子,但是他又有了庙宇的功能
*
* 优点:
* 装饰类和被装饰类可以独立发展,不会相互耦合。
*
* 缺点:
* 多层装饰比较复杂
*
* 使用场景:
* 1,扩展一个类的功能
* 2,动态增加功能,动态撤销功能
* 注意事项:
* 可代替继承
* */
public static void main(String[] args) {
Shape circle = new Circle();
ShapeDecorator redCircle = new RedShapeDecorator(circle);
ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
redRectangle.draw();
redCircle.draw();
circle.draw();
}
}
//创建一个接口
interface Shape {
void draw();
}
// 创建接口的 实现类 rectangle:矩形,长方形
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("shape Rectangle");
}
}
class Circle implements Shape {
@Override
public void draw() {
System.out.println("shape circle");
}
}
// 创建实现了Shape接口的 抽象装饰类
abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape) {
this.decoratedShape = decoratedShape;
}
public void draw() {
decoratedShape.draw();
}
}
// 抽象装饰类的 子类,,实体装饰类
class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
super.draw();// 最初实体类的实现
setBorder(decoratedShape);// 装饰类想要添加的功能
// 既实现了最初的类的方法,又添加了自己想要的功能
}
private void setBorder(Shape decoratedShape) {
System.out.println("border color is red");
}
}
引用:https://www.runoob.com/design-pattern/decorator-pattern.html
更多推荐

所有评论(0)