设计模式 装饰模式
interface Component {
/**原始接口*/
public void go();
}
//2. 具体构件
class ConcreteComponent implements Component {
public void go() {
System.out.println("行走");
}
}
//.装饰角色来了
class Decorator implements Component {
/**持有私有的原始构件*/
private Component component;
/**构造子,委派给原始构件*/
protected Decorator(Component component) {
this.component = component;
}
/**调用原始构件功能,通常就可直接把扩展功能加在此方法中*/
public void go() {
this.component.go();
}
}
//具体装饰(这里演示了两种扩展的情况,走路+听音乐和唱歌s)
class ConcreteDecoratorListen extends Decorator {
/**构造子,相关初始化*/
public ConcreteDecoratorListen(Component component) {
super(component);
// code is here
}
/**商业逻辑,对原始构件功能的扩展*/
public void go() {
listen("听音乐");//执行扩展功能
super.go();
}
private void listen(Object obj){
System.out.println(obj);
}
}
class ConcreteDecoratorSing extends Decorator {
/**构造子,相关初始化*/
public ConcreteDecoratorSing(Component component) {
super(component);
// code is here
}
/**商业逻辑,对原始构件功能的扩展*/
public void go() {
super.go();
System.out.println(sing());;// 执行扩展功能
}
private String sing() {
return"唱歌";
}
}
//客户端调用
public class testDecorate {
public static void main(String[] args) {
/**原始构件*/
Component component = new ConcreteComponent();
/**边听音乐,边走路*/
ConcreteDecoratorListen cdl = new ConcreteDecoratorListen(component);
cdl.go();
System.out.println();
/**边走路,边唱歌*/
ConcreteDecoratorSing cds = new ConcreteDecoratorSing(component);
cds.go();
System.out.println();
//走路,唱歌,听音乐
ConcreteDecoratorListen cdl2 = new ConcreteDecoratorListen(component);
ConcreteDecoratorSing cds2 = new ConcreteDecoratorSing(cdl2);
cds2.go();
}
}