博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰者模式——Java设计模式
阅读量:4573 次
发布时间:2019-06-08

本文共 2596 字,大约阅读时间需要 8 分钟。

装饰模式

1.概念

动态地为对象附加上额外的职责

其目的是包装一个对象,从而可以在运行时动态添加新的职责。每个装饰器都可以包装另一个装饰器,这样理论上来说可以对目标对象进行无限次的装饰。

2.装饰器类图

QQ%E6%88%AA%E5%9B%BE20170509121331.jpg

3.代码

一个早餐店经营两种主食:汉堡和吐司,一段时间后需要加个配料。

主要思路是:以主食(汉堡、吐司)为主体,然后再运行时以配料(火腿、起司)装饰为主食。其UML图为:
decorator.png
(1)抽象构建类————Breakfast.java,早餐的抽象父类

public abstract class Breakfast {    public String description="未知";    public String getDescription(){        return description;    }    public abstract Double cost();}

(2)抽象装饰类————CondimentDecorator.java,是早餐抽象类的子类

public abstract class CondimentDecorator extends Breakfast{    Breakfast myfood;    public CondimentDecorator(Breakfast myfood){        this.myfood=myfood;    }    @Override    public String getDescription(){        return myfood.getDescription();    }    @Override    public Double cost(){        return myfood.cost();    }}

(3)具体构建类————Toast.java、Burger.java

Toast.java

public class Toast extends Breakfast {    public Toast(){        description="吐司";    }    public Double cost(){        return 10d;    }}

Burger.java

public class Burger extends Breakfast {    public Burger(){        description="汉堡";    }    @Override    public Double cost(){        return 15d;    }}

(4)具体装饰类————Cheese.java、Ham.java

Cheese.java

public class Cheese extends CondimentDecorator {    public Cheese(Breakfast myfood) {        super(myfood);    }    @Override    public Double cost() {        return super.cost() + 5;    }    @Override    public String getDescription() {        return super.getDescription() + ",起司";    }}

Ham.java

public class Ham extends CondimentDecorator {    public Ham(Breakfast myfood) {        super(myfood);    }    @Override    public Double cost() {        return super.cost() + 10;    }    @Override    public String getDescription() {        return super.getDescription() + ",火腿";    }}

(5)客户端测试类

public class Decorator {    public static void main(String args[]) {        Breakfast breakfast1 = new Toast();        System.out.println("您点的餐点为:" + breakfast1.getDescription() + "。价格为:" + breakfast1.cost());        Breakfast breakfast2 = new Toast();        breakfast2 = new Ham(breakfast2);        breakfast2 = new Ham(breakfast2);        System.out.println("您点的餐点为:" + breakfast2.getDescription() + "。价格为:" + breakfast2.cost());        Breakfast breakfast3 = new Burger();        breakfast3 = new Ham(breakfast3);        breakfast3 = new Cheese(breakfast3);        breakfast3 = new Cheese(breakfast3);        System.out.println("您点的餐点为:" + breakfast3.getDescription() + "。价格为:" + breakfast3.cost());    }}

结果

您点的餐点为:吐司。价格为:10.0您点的餐点为:吐司,火腿,火腿。价格为:30.0您点的餐点为:汉堡,火腿,起司,起司。价格为:35.0

详细见:

转载于:https://www.cnblogs.com/w1570631036/p/6830887.html

你可能感兴趣的文章
MySQL创表--分页--自关联--
查看>>
python基础_面向对象进阶
查看>>
GitHub从小白到熟悉<一>
查看>>
软件测试员常踩的7个坑,不想再入坑者必看
查看>>
测试基础_<一>
查看>>
前端基础进阶(三):变量对象详解
查看>>
53. Maximum Subarray
查看>>
SSIS 错误代码 DTS_E_OLEDB_EXCEL_NOT_SUPPORTED 没有可用的 OLE DB 访问接口 SSIS 的 64 位版本中不支持 Excel 连接管理器...
查看>>
Ubuntu 16.09下iptables通过raw表实现日志输出和调试
查看>>
切割器
查看>>
[算法]Collebarative Filtering
查看>>
树链剖分详解
查看>>
http://www.imooc.com/video/4767 zepto教学视频笔记
查看>>
clientX,screenX,pageX,offsetX的异同
查看>>
c# in out ref关键字
查看>>
字符串的基本操作
查看>>
day 30 客户端获取cmd 命令的步骤
查看>>
(tips,javascript,office)客户端操作excel文档的注意事项
查看>>
pku 1094 Sorting It All Out ——拓扑排序
查看>>
笔记javascript
查看>>