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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值