装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更为灵活。
结构图:
代码实现:
抽象类:
package unit1to6.test6;
package unit1to6.test6;
public abstract class Component {
public abstract void Operation();
}
具体类:
package unit1to6.test6;
public class ConcreteCompent extends Component{
@Override
public void Operation() {
System.out.println("具体对象的操作");
}
}
抽象装饰类:
package unit1to6.test6;
public class Decorator extends Component{
protected Component component;
public void setComponent(Component component){
this.component=component;
}
@Override
public void Operation() {
if(component!=null){
component.Operation();
}
}
}
具体装饰类:
package unit1to6.test6;
public class ConcreteDecoratorA extends Decorator{
private String addedState;
public void Operation(){
super.Operation();
addedState="New State";
System.out.println("具体装饰对象A的操作");
}
}
具体装饰类2:
package unit1to6.test6;
public class ConcreteDecoratorB extends Decorator{
public void Operation(){
super.Operation();
AddedBehavior();
System.out.println("具体装饰对象B的操作");
}
private void AddedBehavior(){
System.out.println("装饰对象B的特有操作");
}
}
客户端类:
package unit1to6.test6;
public class mainTest {
/* 装饰者模式
* 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更加灵活。
* c,d1,d2有共同的父类
* Decorator中有共同父类的对象,顾new 一个c,可以用来初始化d1,d2
*
* 功能:
* 为已有功能动态的添加更多功能的一种方式。
* 使用场景:一个阶段需要的功能,需要执行顺序,执行个数有变话的功能。
* */
public static void main(String[] args) {
ConcreteCompent c=new ConcreteCompent();
ConcreteDecoratorA d1=new ConcreteDecoratorA();
ConcreteDecoratorB d2=new ConcreteDecoratorB();
d1.setComponent(c);//告诉需要装饰的对象
d2.setComponent(d1);
d2.Operation();
}
}