动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式生成子类更加灵活。

public abstract class Component{
public abstract void operate();//装修方法
}
public class ConcreateComponent extends Component{
@Override
public void operate(){
//具体实现逻辑
}
}
public class Decorator extends Component{
private Component mComponent;
public Decorator(Component component){
this.mComponent = component
}
@Override
public void operate(){
//具体实现逻辑
mComponent.operte()
}
}
public class ConcreateDecoratorA extends Decorator {
public ConcreateDecoratorA (Component component){
super(component)
}
@Override
public void operate(){
//具体实现逻辑
operateA()
mComponent.operte()
operateB()
}
public void operateA(){
//装饰方法逻辑A
mComponent.operte()
}
public void operateB(){
//装饰方法逻辑B
mComponent.operte()
}
}
Component component = new ConcreateComponent()
ConcreateDecoratorA decorateA = new ConcreateDecoratorA (component)
decorateA.operate()
优点:
缺点:
1.Activity、Service、Application和Context的联系
2.缓冲IO流就是对IO流的装饰
使用场景区别
代理模式侧重于对对象行为的特殊控制,不同的代理对象实现对被代理对象行为的不同的控制,并且这些代理的行为控制很少有组合的可能性。
装饰者模式侧重于对被装饰对象属性的扩展,不同的装饰者对象会为被装饰者对象添加不同的属性,并且这些属性可以任意嵌套组合。
模式实现区别
装饰者模式需要提供装饰对象为参数的构造函数,而代理对象则无该项要求,主要原因是装饰者模式需要支持嵌套组合属性。(将装饰类传入另一个装饰类的构造器中,实现多重装饰的效果,避免了多继承)
两者都是通过实现真实对象接口,并内置一个真实对象,通过操作该真实对象来实现接口