装饰者模式(Decorator、Compoment)(早餐销售装饰,动态添加职责)
适用于以下情况:
(1)需要扩展一个类的功能,或给一个类添加附加职责。
(2)需要动态的给·一个对象添加功能,这些功能可以再动态的撤销。
(3)需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。
(4)当不能采用生成子类的方法进行扩充时,一种情况是:可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目爆炸性增长,另一种情况可能是因为类定义被隐藏,或定义不能用于生成子类。
(设计者模式能提供更多的灵活性,创造出更多不同行为的组合)
(设计者模式会导致,设计中出现许多小类,如果过度使用,会是程序变得很复杂)
(装饰者模式是针对抽象组件类型编程,但是如果要是针对具体组件编程,就应该重新思考应用架构,以及装饰者是否合适)
抽象构件类:
public abstract class Breskfast {
private String desciption = "未知";
public String getDesciption() {
return desciption;
}
public void setDesciption(String desciption) {
this.desciption = desciption;
}
public abstract double cost();
}
抽象装饰类:
public abstract class CondimentDecorator extends Breskfast{
private Breskfast myfood; public Breskfast getMyfood() {
return myfood;
}
public CondimentDecorator(Breskfast myfood) {
super();
this.myfood = myfood;
} @Override
public String getDesciption() {
return myfood.getDesciption(); }
@Override
public double cost() {
return myfood.cost();
} }
具体构件类:
public class Toast extends Breskfast{
public Toast() {
this.setDesciption("吐司");
} @Override
public double cost() {
return 10;
} }
具体装饰类:
public class Ham extends CondimentDecorator{ public Ham(Breskfast myfood) {
super(myfood);
} @Override
public double cost() {
return super.cost()+10;
}
@Override
public String getDesciption() {
return super.getDesciption()+",火腿";
} }
客户测试类:
public class Decorator { public static void main(String[] args) {
//点一份吐司
Breskfast breskfast = new Toast();
System.out.println(breskfast.getDesciption()+"价格为:"+breskfast.cost());
//加两份火腿
breskfast = new Ham(breskfast);
breskfast = new Ham(breskfast);
// System.out.println(breskfast.desciption);
System.out.println(breskfast.getDesciption()+"价格为:"+breskfast.cost());
} }
装饰者模式(Decorator、Compoment)(早餐销售装饰,动态添加职责)的更多相关文章
- 装饰者模式 Decorator
项目:咖啡计费系统 背景:现有系统中有一个抽象类Beverage,有2个抽象方法GetDescription和Cost. namespace DecoratorPattern { /// <su ...
- 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)
在前两篇博客中详细的介绍了"策略模式"和“观察者模式”,今天我们就通过花瓶与鲜花的例子来类比一下“装饰模式”(Decorator Pattern).在“装饰模式”中很好的提现了开放 ...
- 浅谈设计模式--装饰者模式(Decorator Pattern)
挖了设计模式这个坑,得继续填上.继续设计模式之路.这次讨论的模式,是 装饰者模式(Decorator Pattern) 装饰者模式,有时也叫包装者(Wrapper),主要用于静态或动态地为一个特定的对 ...
- 【PHP设计模式 09_ZhuangShiQi.php】装饰器模式 (decorator)
<?php /** * [装饰器模式 (decorator)] * 有时候发布一篇文章需要经过很多人手,层层处理 */ header("Content-type: text/html; ...
- 装饰器模式(Decorator)
转自http://blog.csdn.net/hust_is_lcd/article/details/7884320 1.认识装饰器模式 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象 ...
- 设计模式(八)装饰器模式Decorator(结构型)
设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...
- 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法
装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716 ...
- 装饰器模式(Decorator)——深入理解与实战应用
本文为原创博文,转载请注明出处,侵权必究! 1.初识装饰器模式 装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能.其结构图如下: Component为统一接口,也是装饰类和被装 ...
- 设计模式 - 装饰者模式(Decorator Pattern) 具体解释
装饰者模式(Decorator Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者 ...
- 装饰器模式-Decorator(Java实现)
装饰器模式-Decorator(Java实现) 装饰器模式允许向一个现有的对象添加新的功能, 同时又不改变其结构. 其中 "现有对象"在本文中是StringDisplay类. 添加 ...
随机推荐
- Acess link
- java编程规约二
四.OOP规约(Object Oriented Programming,面向对象设计) 1.静态变量和静态方法直接用类名访问,不要再new 对象去访问 2.方法覆盖必须加@Override注解 3.尽 ...
- java笔试之字符逆序(一)
将一个字符串str的内容颠倒过来,并输出.str的长度不超过100个字符. 如:输入“I am a student”,输出“tneduts a ma I”. package test; import ...
- tensorboard在Mac OS X系统环境下如何启动
再次必须写一篇博客,一次来说明这打开tensorboard的艰难之路,遇到了好多错误,真的是走了好多弯路,最后还是解决了 一开始总是报错,不知道是为什么,其实还是自己没有看懂原理,就冲动的开始招呼画瓢 ...
- POJ1160 Post Office-四边形不等式优化DP
方程 $\Large f(i,j)=min(f(i-1,k)+w(k+1,j))$ 其中$w(i,j)$表示在$[i,j]$的村庄都去一个邮局的最小距离和 证明w满足四边形不等式 设$w_k(i,j) ...
- 使用应用程序(Java/Python)访问MaxCompute Lightning进行数据开发
MaxCompute Lightning是MaxCompute产品的交互式查询服务,支持以PostgreSQL协议及语法连接访问Maxcompute项目,让您使用熟悉的工具以标准 SQL查询分析Max ...
- field方法属于模型的连贯操作方法之一
field方法属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段,可以用于查询和写入操作. 1.用于查询 指定字段 在查询操作中field方法是使用最频繁的. $Model->fie ...
- 数组(Array)与 字符串(String)公用的属性与方法
数组与字符串都有很多方法,有一些方法是公用的,在这里就将数组与字符串公用的方法提取出来,方便大家的记忆 1. length 可通过str.length与arr.length分别取到字符串与数组的长度: ...
- privoxy 安装
https://www.privoxy.org/sf-download-mirror/Sources/ 1.挑选源码版本,下载,解压 2.增加用户 useradd privoxy 3.make &am ...
- mtk 的conferrence call建立流程
(重点看main_log与) 抓mtk log: 1.*#*#82533284#*#* 进入抓log UI 2.*#*#825364#*#* 进入工程模式 3.进入"Lo ...