设计模式 装饰模式


设计模式 装饰模式
 


设计模式 装饰模式
 

 

 
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();
        
    }

}