天天看点

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

继续阅读