HeadFirst笔记03:装饰者模式

装饰者模式是什么?

装饰者模式顾名思义就是装饰被装饰者的模式,比如装饰圣诞树。

举例:暖暖系列的换装游戏

暖暖要换装,要挂很多东西,而暖暖有不同打扮然后进行打扮评分,如果正常来讲要创建很多物品类,也就是由暖暖来调用很多个物品类加人上。这样太过麻烦,就相当于把所有的装扮都扔在一起让暖暖挑。而打扮评分也得一个一个调用加上去。

但装饰者模式就不一样,它更倾向于组合而不是继承。但它比较重要的一点就是装饰者都有一个共同的超类,这样才能使装饰者覆盖被装饰者,达到装饰的目的。简单来说相当于自定义套装形式出现。

这样的好处在于:

装饰类和被装饰类不互相耦合,可各自独立发展,可动态扩展。

实际简单例子的代码:

结构示意图:

1.首先的创建源类,注意抽象abstract

//一切的基础装扮源
public abstract class attire {
    String description="未知装扮";
    //装扮描述
    public String getDescription(){
        return description;
    }
    //装扮分数
    public abstract int score();
}

 2.创建第一层装扮-衣服

//衣服-红色长裙
public class redlonguette extends attire {
    public redlonguette(){
        description="红色长裙";
    }
    @Override
    public int score() {
        return 50;
    }
}

3.创建第二层装扮-化妆 

//化妆
public abstract class makeup extends attire {
    public abstract String getDescription();
}
//腮红
public class makeup_rouge extends makeup {
    //被装饰者
    attire attire;

    //将继承的被装饰者对象赋值给当前的被装饰者
    public makeup_rouge(attire attire){
        this.attire=attire;
    }

    @Override
    public String getDescription() {
        return attire.getDescription() + "+腮红";
    }

    @Override
    public int score() {
        return 5+attire.score();
    }
}
//白色眉毛
public class makeup_whiteEyebrow extends makeup {
    //被装饰者
    attire attire;

    //将继承的被装饰者对象赋值给当前的被装饰者
    public makeup_whiteEyebrow(attire attire){
        this.attire=attire;
    }

    @Override
    public String getDescription() {
        return attire.getDescription() + "+白色眉毛";
    }

    @Override
    public int score() {
        return 11+attire.score();
    }
}

4.实际调用测试

//装饰者模式
public class DecoratorPattern {
    public static void main(String[] args) {
          //不添加化妆,只衣服
          attire attireTest=new redlonguette();
          System.out.println("不添加化妆,只用衣服");
          System.out.println("描述:"+attireTest.getDescription());
          System.out.println("分数:"+attireTest.score()+"分");


          //衣服+化妆
          attire attireTest2=new redlonguette();
          attireTest2 = new makeup_whiteEyebrow(attireTest2);
          attireTest2 = new makeup_rouge(attireTest2);
          System.out.println("衣服基础上添加2种化妆");
          System.out.println("描述:"+attireTest2.getDescription());
          System.out.println("分数:"+attireTest2.score()+"分");


    }
}

结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值