天天看點

java設計模式--裝飾模式

裝飾模式:

動态的将責任附加給了對象,使對象易于橫向和總想擴充,提供了比繼承更有彈性的替代方案。

我們來看一下代碼片段

建立一個要唱歌的人

/**
 * @author Lichenyi
 * @date 2017-7-6
 */
public interface Human {
    public void sing();
}
           

//把這個人包裝成為一個歌手

/**
 * @author Lichenyi
 * @date 2017-7-4
 */
public class Singer implements Human {
    @Override
    public void sing(){
        System.out.println("我唱唱唱......");
    }
}
           

//這個歌手正在唱歌

/**
 * @author Lichenyi
 * @date 2017-7-5
 */
public class SingerSing extends Singer {
    private Singer singer;
    public SingerSing(Singer singer){
        this.singer = singer;
    }

    @Override
    public void sing() {
        singer.sing();
    }
}
           

//裝飾A–唱歌的時候伴舞

/**
 * @author Lichenyi
 * @date 2017-7-5
 */
public class SingerDecorateA  extends SingerSing{

    public SingerDecorateA(Singer singer) {
        super(singer);
    }

    @Override
    public void sing() {
        decorate();
        super.sing();
    }

    private void decorate(){
        System.out.println("伴舞..");
    }
}
           

//裝飾B–唱歌的時候有音樂

/**
 * @author Lichenyi
 * @date 2017-7-5
 */
public class SingerDecorateB extends SingerSing{

    public SingerDecorateB(Singer singer) {
        super(singer);
    }

    @Override
    public void sing() {
        decorate();
        super.sing();
    }

    private void decorate(){
        System.out.println("播放背景音樂..");
    }
}
           

//裝飾C–唱歌完畢後,經曆介紹

/**
 * @author Lichenyi
 * @date 2017-7-5
 */
public class SingerDecorateC extends SingerSing{

    public SingerDecorateC(Singer singer) {
        super(singer);
    }

    @Override
    public void sing() {
        super.sing();
        decorate();
    }

    private void decorate(){
        System.out.println("經曆介紹..");
    }
}
           

優點:其拓展性十分良好,通過使用不同的裝飾類來使得對象具有多種多樣的屬性,靈活性比直接繼承好。

缺點:産生了過多的裝飾類,代碼難于了解,不易于排錯。

項目位址:https://github.com/lichenyigit/designModel3-decorate.git

繼續閱讀