装饰器模式 Decorator Pattern

装饰者模式(Decorator Pattern)是指在不改变元祐对象的基础上将功能附加到对象上,提供了比继承更有弹性的方案(即扩展原有对象的功能),属于结构型模式。装饰者模式适用于以下场景:

  1. 扩展一个类的功能或给一个类添加附加的职责。
  2. 动态的给一个对象添加功能,这些功能可以再动态地撤销。

以日常生活中一个小例子来讲解装饰者模式的应用。如:我们在平时的上班的早上,很多人可能都是起的比较晚,走在路上随便买点煎饼来对付。

1、首先创建一个煎饼的抽象类

public abstract class Battercake {
    protected abstract String getMsg();
    protected abstract int getPrice();
}

2、创建一个基本的煎饼类

public class BaseBattercake extends Battercake {

    @Override
    protected String getMsg() {
        return "煎饼果子";
    }

    @Override
    protected int getPrice() {
        return 5;
    }
}

3、创建一个抽象的套餐装饰者类(为什么要创建这个呢?因为有人要加鸡蛋,有人要加火腿,有人要加多个[不固定])

public abstract class BattercakeDecorator extends Battercake {

    /** 静态代理 */
    private Battercake battercake;

    public BattercakeDecorator(Battercake battercake) {
        this.battercake = battercake;
    }

    @Override
    protected String getMsg() {
        return this.battercake.getMsg();
    }

    @Override
    protected int getPrice() {
        return this.battercake.getPrice();
    }
}

4、创建一个加鸡蛋的煎饼装饰器

public class EggDecorator extends BattercakeDecorator {

    public EggDecorator(Battercake battercake) {
        super(battercake);
    }

    @Override
    protected String getMsg() {
        return super.getMsg() + "+1个鸡蛋";
    }

    @Override
    protected int getPrice() {
        return super.getPrice() + 1;
    }
}

5、创建一个加火腿的装饰器

public class SausageDecorator extends BattercakeDecorator {

    public SausageDecorator(Battercake battercake) {
        super(battercake);
    }

    @Override
    protected String getMsg() {
        return super.getMsg() + "+1个火腿";
    }

    @Override
    protected int getPrice() {
        return super.getPrice() + 2;
    }
}

6、所有的步骤都已经写完了,现在用一个测试类来测试是否有效。

public class Test {

    public static void main(String[] args) {

        Battercake battercake = null;
        // 基本套餐
        battercake = new BaseBattercake();
        // 加一个鸡蛋
        battercake = new EggDecorator(battercake);
        // 加个火腿
        battercake = new SausageDecorator(battercake);
        // 再加个鸡蛋
        battercake = new EggDecorator(battercake);

        System.out.println(battercake.getMsg() + ",总价格:" + battercake.getPrice());
    }
}

打印的结果如下:

煎饼果子+1个鸡蛋+1个火腿+1个鸡蛋,总价格:9

从上面的打印结果可知,装饰者模式的作用为动态的添加或者或者撤销某一项功能。由于每人的要求不同,从而可以根据各自的要求制定相应的计划获得需要的结果。

而在次示例中,原有的煎饼类BaseDecorator 并没有改变,当我们想要一些新的功能的时候只需要利用一个装饰器就可以了,这就是装饰器模式独特的地方。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值