装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
适用性:
1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2、处理那些可以撤销的职责。
3、当不能采用生成子类的方法进行扩充时。
参与者:
1、Component:定义一个对象接口,可以给这些对象动态地添加职责。
2、ConcreteComponent:定义一个具体的对象,可以给这个对象添加一些职责。
3、Decorator:装饰抽象类,继承了Component从外来扩展Component类的功能,维持一个指向Component对象的指针,并定义一个与Component接口一致的借口。
4、ConcreteDecorator:向组件添加职责
abstract class Component{
public abstract void operation();
}
class ConcreteComponent extends Component
{
public void operation(){
System.out.println("具体对象的操作");
}
}
abstract class Decorator :Component
{
protected Component component;
public void SetComponent(Component component)
{this.component=component;}
public void operation(){
if(component !=null)
{
component.operation();
}
}
}
ConcreteDecoratorA extends Decorator
{
private String addedState;
public void operation(){
super.operration();//首先运行Component的Operation(),再执行本类的功能,如addedState
//相当于对原Component进行装饰
addedState="New State";
System.out.println("具体装饰对象A的操作");
}
}
ConcreteDecoratorB extends Decorator
{
private String addedState;
public void operation(){
super.operration();//首先运行Component的Operation(),再执行本类的功能,如addedState
//相当于对原Component进行装饰
AddedBehavior();
System.out.println("具体装饰对象B的操作");
}
private void AddedBehavior()
{
//本类独有方法
}
}
public static void main(String []args)
{
ConcreteComponent c=new ConcreteComponent();
ConcreteDecoratorA d1=new ConcreteDecoratorA();
ConcreteDecoratorB d2=new ConcreteDecoratorB();
d1.setComponent(c);
d2.setComponent(d1);
d2.operation();
//有点像链表的形式
}
装饰模式是利用SetComponent来对对象进行包装。