网站开发学习网,免费咨询在线,做明星网站,一个网站多大Java装饰器模式 摘要实现范例 装饰器模式#xff08;Decorator Pattern#xff09;允许向一个现有的对象添加新的功能#xff0c;同时又不改变其结构 装饰器模式创建了一个装饰类#xff0c;用来包装原有的类#xff0c;并在保持类方法签名完整性的前提下#xff0c;提供… Java装饰器模式 摘要实现范例 装饰器模式Decorator Pattern允许向一个现有的对象添加新的功能同时又不改变其结构 装饰器模式创建了一个装饰类用来包装原有的类并在保持类方法签名完整性的前提下提供了额外的功能
装饰器模式属于结构型模式它是作为现有的类的一个包装
摘要
1. 意图
动态地给一个对象添加一些额外的职责。就增加功能来说装饰器模式相比生成子类更为灵活2. 主要解决
一般的我们为了扩展一个类经常使用继承方式实现由于继承为类引入静态特征并且随着扩展功能的增多子类会很膨胀3. 何时使用
在不想增加很多子类的情况下扩展类
4. 如何解决
将具体功能职责划分同时继承装饰者模式5. 关键代码
Component类充当抽象角色不应该具体实现修饰类引用和继承Component类具体扩展类重写父类方法
6. 应用实例
孙悟空有72变当他变成”庙宇”后他的根本还是一只猴子但是他又有了庙宇的功能不论一幅画有没有画框都可以挂在墙上但是通常都是有画框的并且实际上是画框被挂在墙上在挂在墙上之前画可以被蒙上玻璃装到框子里这时画、玻璃和画框形成了一个物体
7. 优点
装饰类和被装饰类可以独立发展不会相互耦合装饰模式是继承的一个替代模式装饰模式可以动态扩展一个实现类的功能
8. 缺点
多层装饰比较复杂
9. 使用场景
扩展一个类的功能动态增加功能动态撤销
10. 注意事项
可代替继承
实现 创建一个Shape接口和实现了Shape接口的实体类创建一个实现了Shape接口的抽象装饰类ShapeDecorator并把Shape对象作为它的实例变量创建类RedShapeDecorator实现了ShapeDecorator实体类创建类DecoratorPatternDemo使用RedShapeDecorator来装饰Shape对象
范例
我们通过下面的范例来演示装饰器模式的用法其中我们将把一个形状装饰上不同的颜色同时又不改变形状类
1.创建一个接口.
Shape.java
package com.demo.gof;
public interface Shape {void draw();
}2. 创建实现接口的实体类
Rectangle.java
package com.demo.gof;
public class Rectangle implements Shape {Overridepublic void draw() {System.out.println(Shape: Rectangle);}
}Circle.java
package com.demo.gof;
public class Circle implements Shape {Overridepublic void draw() {System.out.println(Shape: Circle);}
}3. 创建实现了 Shape 接口的抽象装饰类
ShapeDecorator.java
package com.demo.gof;
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
package com.demo.gof;
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
package com.demo.gof;
public class DecoratorPatternDemo {public static void main(String[] args) {Shape circle new Circle();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();}
}编译运行以上 Java 范例输出结果如下
$ javac -d . src/main/com.demo/gof/DecoratorPatternDemo.java
$ java com.demo.gof.DecoratorPatternDemo
Circle with normal border
Shape: CircleCircle of red border
Shape: Circle
Border Color: RedRectangle of red border
Shape: Rectangle
Border Color: Red