其他分享
首页 > 其他分享> > 设计模式-装饰器模式

设计模式-装饰器模式

作者:互联网

微信关注公众号 JavaStorm 获取最新内容。

装饰器模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活;它允许向一个现有的对象添加新的功能,同时又不改变其结构。==装饰器模式属于结构型模式==。

UML 类图

装饰器模式

使用场景

现在有一个场景:煎饼果子,科技园上班族早上去买煎饼果子(Pancake),有的人要加鸡蛋 (Egg)、有的人加火腿 (Ham)、有的人加生菜 (Lettuce)。有的土豪煎饼果子来一套全都要。现在我们来定义煎饼烹饪实现。(ps:留一个功能读者自己实现:不同的套餐价格是不一样的,如何计算出不同煎饼果子的价格?有兴趣的读者可以留言或者微信公众号后台留言)。

代码实现

代码可以左右滑动

  1. 先定义煎饼接口也就是我们的被装饰类,以及烹饪的方法 。
package com.zero.headfirst.decorator;

public interface Pancake {
    /**
     * 烹饪方法
     */
    void cook();
}
  1. 定义一个乞丐版煎饼,被装饰对象。
package com.zero.headfirst.decorator;

/**
 * 被装饰对象:定义最基本的乞丐版煎饼,啥都没加
 */
public class BeggarPancake implements Pancake {
    @Override
    public void cook() {
        System.out.println("乞丐版基本煎饼");
    }
}
  1. 定义抽象装饰类 煎饼果子装饰器 PancakeDecorator:抽象装饰器角色,实现煎饼接口(被装饰器接口),持有被装饰器的引用 (pancake)将烹饪行为转发具体的装饰器。
package com.zero.headfirst.decorator;

/**
 * 抽象装饰器角色,实现煎饼接口(被装饰器接口),持有被装饰器的引用将烹饪行为转发具体的装饰器。
 */
public abstract class PancakeDecorator implements Pancake {

    private Pancake pancake;

    public PancakeDecorator(Pancake pancake) {
        this.pancake = pancake;
    }

    @Override
    public void cook() {
        if (pancake != null) {
            pancake.cook();
        }
    }
}
  1. 各种具体装饰类对乞丐版煎饼进行不等级别的土豪加工。首先继承 抽象出来的 PancakeDecorator ,重写 cook 方法,实现加工。

    EggDecorator 鸡蛋装饰器:继承 PancakeDecorator,重写 cook 方法。动态添加鸡蛋,然后调用pancake 的cook。

package com.zero.headfirst.decorator;

/**
 * 鸡蛋装饰器:覆盖cook方法,加入自身的实现,并且调用父类的cook方法,也就是构造函数中
 * EggDecorator(Pancake pancake),这里传入的pancake的cook操作
 */
public class EggDecorator extends PancakeDecorator {
    public EggDecorator(Pancake pancake) {
        super(pancake);
    }

    @Override
    public void cook() {
        System.out.println("加一个鸡蛋;");
        super.cook();
    }
}

火腿装饰器: HamDecorator

package com.zero.headfirst.decorator;

/**
 * 火腿装饰器
 */
public class HamDecorator extends PancakeDecorator {

    public HamDecorator(Pancake pancake) {
        super(pancake);
    }

    @Override
    public void cook() {
        System.out.println("加一个火腿;");
        super.cook();
    }

}

生菜装饰器

package com.zero.headfirst.decorator;

/**
 * 生菜装饰器
 */
public class LettuceDecorator extends PancakeDecorator {

    public LettuceDecorator(Pancake pancake) {
        super(pancake);
    }

    @Override
    public void cook() {
        System.out.println("加生菜;");
        super.cook();
    }

}
  1. 定义一个煎饼果子摊位。
package com.zero.headfirst.decorator;

/**
 * 煎饼果子店
 */
public class PancakeShop {
    public static void main(String[] args) {
        System.out.println("========土豪来了,全都加上。======");
        BeggarPancake beggarPancake = new BeggarPancake();
        EggDecorator eggDecorator = new EggDecorator(beggarPancake);
        HamDecorator hamAndEggDecorator = new HamDecorator(eggDecorator);
        LettuceDecorator lettuceAndHamAndEggDecorator = new LettuceDecorator(hamAndEggDecorator);
        lettuceAndHamAndEggDecorator.cook();

        System.out.println("========苦逼码农来了,只要鸡蛋补补脑。=====");
        BeggarPancake beggarPancake1 = new BeggarPancake();
        EggDecorator eggDecorator1 = new EggDecorator(beggarPancake1);
        eggDecorator1.cook();
    }
}
  1. 运行结果
========土豪来了,全都加上。======

加生菜;

加一个火腿;

加一个鸡蛋;

乞丐版基本煎饼

========苦逼码农来了,只要鸡蛋补补脑。=====

加一个鸡蛋;

乞丐版基本煎饼

总结

真实世界的装饰: Java I/O。
注意事项与要点

适用场景

### 优点

缺点

以上代码可参考我的 GitHub : https://github.com/UniqueDong/zero-design-stu。headfirst包下。欢迎关注公众号: JavaStorm 获取最新文章,也可在后台留言提出意见。收藏与关注是最大的鼓励。

JavaStorm

标签:Pancake,模式,public,煎饼,pancake,cook,设计模式,装饰
来源: https://www.cnblogs.com/uniqueDong/p/10993186.html