装饰者模式

本文地址:http://www.cnblogs.com/masque/p/3833141.html

部分资料来自网络,代码都是已运行实践,转载请在明显位置注明出处.

下面是一个咖啡添加不同的调料得到价钱和名称的算法

先定义了一个接口

 1 package org.masque.designpatterns.decorator;
 2 /**
 3  *
 4  * Description:
 5  * InterForAll.java Create on 2014年7月9日 上午10:59:50
 6  * @author masque.java@outlook.com
 7  * @version 1.0
 8  * Copyright (c) 2014 Company,Inc. All Rights Reserved.
 9  */
10 public interface InterForAll {
11
12     double display();
13
14     String print();
15 }

实现价钱和描述.
抽象方法的父类有价钱和描述的属性,计算价钱和合并名称的方法.

 1 package org.masque.designpatterns.decorator;
 2 /**
 3  *
 4  * Description:
 5  * AbstractParent.java Create on 2014年7月9日 上午11:00:04
 6  * @author masque.java@outlook.com
 7  * @version 1.0
 8  * Copyright (c) 2014 Company,Inc. All Rights Reserved.
 9  */
10 public abstract class AbstractParent implements InterForAll {
11
12     protected String describe;
13
14     protected double price;
15
16     @Override
17     public abstract double display();
18
19     @Override
20     public abstract String print();
21
22     public String getDescribe() {
23         return describe;
24     }
25
26     public void setDescribe(String describe) {
27         this.describe = describe;
28     }
29
30     public double getPrice() {
31         return price;
32     }
33
34     public void setPrice(double price) {
35         this.price = price;
36     }
37
38     @Override
39     public String toString() {
40         return "AbstractParent [describe=" + describe + ", price=" + price
41                 + "]";
42     }
43 }

一个咖啡类

 1 package org.masque.designpatterns.decorator;
 2 /**
 3  *
 4  * Description:
 5  * Coffee.java Create on 2014年7月9日 上午11:00:11
 6  * @author masque.java@outlook.com
 7  * @version 1.0
 8  * Copyright (c) 2014 Company,Inc. All Rights Reserved.
 9  */
10 public final class Coffee extends AbstractParent {
11
12     public Coffee(){
13         this.describe = "Coffee";
14         this.price = .95;
15     }
16
17     @Override
18     public double display() {
19         return this.price;
20     }
21
22     @Override
23     public String print() {
24         return this.describe;
25     }
26 }

一个牛奶类

 1 package org.masque.designpatterns.decorator;
 2 /**
 3  *
 4  * Description:
 5  * Milk.java Create on 2014年7月9日 上午11:00:32
 6  * @author masque.java@outlook.com
 7  * @version 1.0
 8  * Copyright (c) 2014 Company,Inc. All Rights Reserved.
 9  */
10 public final class Milk extends AbstractParent {
11
12     private AbstractParent abstractParent;
13
14     public Milk(AbstractParent abstractParent){
15         this.describe = "Milk";
16         this.price = .2;
17         this.abstractParent = abstractParent;
18     }
19
20     @Override
21     public double display() {
22         return abstractParent.display() + price;
23     }
24
25     @Override
26     public String print() {
27         return abstractParent.print() + "," + describe;
28     }
29 }

一个莫妮卡类

 1 package org.masque.designpatterns.decorator;
 2 /**
 3  *
 4  * Description:
 5  * Mocha.java Create on 2014年7月9日 上午11:00:39
 6  * @author masque.java@outlook.com
 7  * @version 1.0
 8  * Copyright (c) 2014 Company,Inc. All Rights Reserved.
 9  */
10 public final class Mocha extends AbstractParent {
11
12     private AbstractParent abstractParent;
13
14     public Mocha(AbstractParent abstractParent){
15         this.describe = "Mocha";
16         this.price = .3;
17         this.abstractParent = abstractParent;
18     }
19
20     @Override
21     public double display() {
22         return abstractParent.display() + price;
23     }
24
25     @Override
26     public String print() {
27         return abstractParent.print() + "," + describe;
28     }
29 }

我们来实现咖啡加牛奶加莫妮卡的实现

 1 package org.masque.designpatterns.decorator;
 2 /**
 3  *
 4  * Description:
 5  * Main.java Create on 2014年7月9日 上午11:00:22
 6  * @author masque.java@outlook.com
 7  * @version 1.0
 8  * Copyright (c) 2014 Company,Inc. All Rights Reserved.
 9  */
10 public class Main {
11
12     public static void main(String[] args) {
13         AbstractParent coffee1 = new Coffee();
14         System.out.println(coffee1.toString());
15
16         AbstractParent coffee2 = new Coffee();
17         coffee2 = new Milk(coffee2);
18         System.out.println("------+Milk----------");
19         System.out.println(coffee2.toString());
20         System.out.println(coffee2.display());
21         System.out.println(coffee2.print());
22
23         System.out.println("------+Mocha----------");
24         coffee2 = new Mocha(coffee2);
25         System.out.println(coffee2.toString());
26         System.out.println(coffee2.display());
27         System.out.println(coffee2.print());
28     }
29 }

运行结果

转载于:https://www.cnblogs.com/masque/p/3833141.html

设计模式-装饰者模式[Decorator]相关推荐

  1. 11.设计模式--装饰者模式(Decorator模式)

    1.定义 装饰者模式是一种结构型模型,是动态的给对象增加职责,对于新增功能来说要比通过子类方式更加的灵活. 想想一下现在有一块蛋糕,他本质上就是一个蛋糕,而如果在蛋糕上加上巧克力就变成了巧克力蛋糕,而 ...

  2. 设计模式:装饰者模式(Decorator)

    装饰者模式: 动态的将新功能附加到对象上, 在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(OCP). java的IO结构,FileInputStream就是一个装饰者 public ...

  3. JAVA设计模式-装饰器模式(Decorator)

    装饰器模式(Decorator) 为了某个实现类在不修改原始类的基础上进行动态地覆盖或者增加方法 采用--------装饰器模式 实现类要保持与原有类的层级关系 装饰器模式是一种特殊的适配器模式 拿适 ...

  4. 装饰器模式(Decorator)

    一.装饰者模式的定义: 装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 结构: 装饰器UML.png (1)抽象构件( ...

  5. 设计模式装饰者模式_装饰者模式如何拯救了我的一天

    设计模式装饰者模式 在工作中,我正在处理庞大的Java代码库,该代码库是由许多不同的开发人员在15年的时间里开发的. 并不是所有的事情都由书来完成,但是同时我通常无法重构遇到的每一个奇怪的事物. 尽管 ...

  6. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

  7. 读书笔记---Head First 设计模式--- 装饰者模式

    读书笔记-Head First 设计模式- 装饰者模式 装饰者模式(Decorator Pattern) 装饰者模式--动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. ...

  8. c语言装饰,C/C++知识点之装饰器模式(Decorator) C++

    本文主要向大家介绍了 C/C++知识点之装饰器模式(Decorator) C++,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助.装饰器模式是比较常用的一种设计模式,Python中就 ...

  9. 10. 设计模式-装饰者模式

    文章目录 设计模式-装饰者模式 1. 案例引出装饰者模式 2. 装饰者模式 2.1 装饰者模式定义 2.2 装饰者模式原理 2.3 装饰者模式解决星巴克咖啡订单问题 2.4 代码实现 抽象类Drink ...

最新文章

  1. 我的android绘图学习笔记(二)
  2. 一文详解OpenCV中的CUDA模块
  3. python读取配置文件不更改大小写_Python不区分大小写的文件名?
  4. manual php,PHP - Manual: 介绍 (官方文档)
  5. angular2 php 教程,有关Material在Angular2中的使用(详细教程)
  6. hbase 学习(十四)Facebook针对hbase的优化方案分析
  7. EnforceLearning-主动强化学习
  8. java之RSA和Base64加密帮助类
  9. win2016开启ntp_Windows服务器开启NTP服务
  10. 为什么游戏盒子源码那么重要?(不搞清楚游戏盒子源码,游戏代理很难顺利)(远离那些免费游戏盒子源码,会变得不幸)
  11. access里面的表达式运用_Access表达式
  12. Office 2007免序列号安装的ISO制作方法
  13. 跟我一起学习ZeroMQ(7):发布订阅模式(Publish-subscribe pattern)ZMQ_XPUB和ZMQ_XSUB
  14. 解决导入maven工程时cannot resolve依赖问题
  15. Python 相异性矩阵计算
  16. cacheable更新_详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用
  17. unity 构建迷宫_教程:使用GameDraw在Unity中构建迷宫游戏关卡
  18. win10+ ubuntu16.04 双系统及无线、输入法、deepin-wineQQ微信等配置(亲测)
  19. SM4国密算法整理-流程图
  20. 免费在线流程图、网络拓扑图等制图 --- Process On --- https://www.processon.com

热门文章

  1. 避免关注底层硬件,Nvidia将机器学习与GPU绑定
  2. AI最后--热门游戏引擎(CN地区)
  3. java 数组中差值最大数对,[算法题] 求数组有序后相邻元素之间的最大差值
  4. 闭包总结(2018.03.19)
  5. java面试④数据库部分
  6. windows下看端口占用
  7. 海纳百川、有容乃大:从4个角度解读京东3C新方向
  8. poj1284 Primitive Roots
  9. NOI2006 最大获利
  10. zeppelin报错master is set as yarn, but spark.submit.deployMode is not specified