研究Android的Context时,framework层设计使用了装饰器模式,复习一下装饰器模式:
优点:
可以动态的给对象添加功能,比生成子类更加灵活,创建装饰类,包装原有类,在保持原有类方法完整的情况下提供额外功能;
缺点:
包裹层数较多时,不好理解和管理,没有继承结构清晰
使用场景:
1、扩展一个类的功能。 2、动态增加功能,动态撤销。
1. 创建接口:
package com.company.src.DecorateMode;
public interface Shape {
void drow();
}
2.创建实现接口的具体类
创建圆形类
package com.company.src.DecorateMode;
public class CircleShape implements Shape {
@Override
public void drow() {
System.out.println("CircleShape//drow():circle");
}
}
创建矩形类
package com.company.src.DecorateMode;
public class RectangleShape implements Shape {
@Override
public void drow() {
System.out.println("RectangleShape//drow():Rectangle");
}
}
3. 创建shape接口的装饰类
package com.company.src.DecorateMode;
public abstract class ShapeDecorator implements Shape{
protected Shape decoratedShape;//注意这里的限定符 不能是private
public ShapeDecorator(Shape decoratedShape) {
this.decoratedShape = decoratedShape;
}
@Override
public void drow() {
decoratedShape.drow();
}
}
4. 创建扩展功能的实体装饰类
package com.company.src.DecorateMode;
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void drow() {
// super.drow();
decoratedShape.drow();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape){
System.out.println("RedShapeDecorator//setRedBorder()");
}
}
5. main函数运行测试
// 装饰器模式
Shape circle = new CircleShape();
ShapeDecorator redCircle = new RedShapeDecorator(new CircleShape());
ShapeDecorator redRectangle = new RedShapeDecorator(new RectangleShape());
System.out.println("\n---------Circle with normal border------------");
circle.drow();
System.out.println("\n--------------Circle of red border-------------");
redCircle.drow();// 扩展功能
System.out.println("\n----------rectangle of red border--------------");
redRectangle.drow();// 扩展功能
6. 调试结果
7. 参考
【1】https://www.runoob.com/design-pattern/decorator-pattern.html
【2】https://www.cnblogs.com/volcano-liu/p/10897897.html
【3】https://blog.csdn.net/wjavadog/article/details/102769605