文档章节

七、设计模式——装饰模式

文森特梵高
 文森特梵高
发布于 2015/08/15 14:49
字数 578
阅读 51
收藏 3

咖啡馆订单系统项目

1)咖啡种类:Espresso、ShortBlack、LongBlack、Decaf

2)调料:Milk、Soy、Chocolate

3)扩展性好、方便改动、方便维护

单品的咖啡通过调料混合成卖品。



OO设计方案


定义一个抽象的超类,Drink作为所有咖啡的父类。

咋一看好像能够满足需求,可是仔细推敲,如果加奶的咖啡这种情形怎么表示?或者加奶+巧克力+豆浆的咖啡呢?

这将会是噩梦,因为由此扩展开来的类将会很多很多。


另一个思路,既然每种单品都可以加配料,那么在超类中提供用布尔类型来标记哪些配料需要增加。

分别用三个字段isMilk , isSoy ,isChocolate,子类通过set方法来指定单品需加哪些配料。

这样能够解决类暴炸的问题,我们可以在cost中使用switch来决定结算的价格。

但是这又有扩展性的问题,如果有新调料增加,就必须修改超类。


装饰者模式


装饰者模式像打包快递。

1)有主体 :一个

2)有包装:多层

装饰者模式:动态的将新功能附加到对象上。

装饰层需要持有主体,在自己的方法中加入包装的操作与主体的操作一起完成功能。我自己也晕了...

以下是主体类:

public abstract class Drink {
	public String description="";
	private float price=0f;;
	public void setDescription(String description)
	{
		this.description=description;
	}
	public String getDescription()
	{
		return description+"-"+this.getPrice();
	}
	public float getPrice()
	{
		return price;
	}
	public void setPrice(float price)
	{
		this.price=price;
	}
	public abstract float cost();	
}

public  class Coffee extends Drink {
	@Override
	public float cost() {
		return super.getPrice();
	}
}

public class Decaf extends Coffee {
	public Decaf()
	{
		super.setDescription("Decaf");
		super.setPrice(3.0f);
	}
}

public class LongBlack extends Coffee{
	public LongBlack()
	{
		super.setDescription("LongBlack");
		super.setPrice(6.0f);
	}
}

装饰部分:

public  class Decorator extends Drink {
	private Drink Obj;
	public Decorator(Drink Obj){
		this.Obj=Obj;
	};
	@Override
	public float cost() {
		return super.getPrice()+Obj.cost();
	}
	@Override
	public String getDescription()
	{
		return super.description+"-"+super.getPrice()+"&&"+Obj.getDescription();
	}
}

public class Chocolate extends Decorator {
	public Chocolate(Drink Obj) {		
		super(Obj);
		super.setDescription("Chocolate");
		super.setPrice(3.0f);
	}
}

public class Milk extends Decorator {
	public Milk(Drink Obj) {		
		super(Obj);
		super.setDescription("Milk");
		super.setPrice(2.0f);
	}
}

测试代码:

public class CoffeeBar {
	public static void main(String[] args) {
		Drink order;
		order=new Decaf();
		System.out.println("order1 price:"+order.cost());
		System.out.println("order1 desc:"+order.getDescription());
		
		System.out.println("****************");
		order=new LongBlack();
		order=new Milk(order);
		order=new Chocolate(order);
		order=new Chocolate(order);
		System.out.println("order2 price:"+order.cost());
		System.out.println("order2 desc:"+order.getDescription());
	}
}

运行结果:

order1 price:3.0
order1 desc:Decaf-3.0
****************
order2 price:14.0
order2 desc:Chocolate-3.0&&Chocolate-3.0&&Milk-2.0&&LongBlack-6.0



© 著作权归作者所有

共有 人打赏支持
上一篇: 设计模式总结
下一篇: maven使用经验集
文森特梵高
粉丝 2
博文 28
码字总数 15386
作品 0
广州
程序员
私信 提问
小菜学设计模式——设计模式总结之结构型

1、设计模式总结 设计模式总共23个,但是常用的不到10个,下面就把这23个设计模式进行整理归类,具体如下: 1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型...

learn_more
2015/07/06
0
0
ES7 Decorator 装饰者模式

原作者:玄农 装饰模式 设计模式大家都有了解,网上有很多系列教程,比如 JS设计模式等等。 这里只分享 装饰者模式 以及在 如何使用 ES7 的 概念 装饰模式 v.s. 适配器模式 装饰模式和适配器...

_朴灵_
2018/05/14
0
0
《JavaScript设计模式与开发实践》最全知识点汇总大全

系列文章: 《JavaScript设计模式与开发实践》基础篇(1)—— this、call 和 apply 《JavaScript设计模式与开发实践》基础篇(2)—— 闭包和高阶函数 《JavaScript设计模式与开发实践》模式...

嗨呀豆豆呢
01/04
0
0
JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模式、工厂方法模式、单例设计模式之饿汉式和懒汉式、Runtime类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52717096 JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模...

Aduroidpc
2016/10/01
0
0
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(11.9)hive操作基础知识

上一篇博客分享了hive的简介和初体验,本节博主将继续分享一些hive的操作的基础知识。 DDL操作 (1)创建表 #建表语法CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name ...

em_aaron
今天
1
0
OSChina 周四乱弹 —— 我家猫真会后空翻

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @我没有抓狂 :#今天听这个# 我艇牛逼,百听不厌,太好听辣 分享 Led Zeppelin 的歌曲《Stairway To Heaven》 《Stairway To Heaven》- Led Z...

小小编辑
今天
2
0
node调用dll

先安装python2.7 安装node-gyp cnpm install node-gyp -g 新建一个Electron-vue项目(案例用Electron-vue) vue init simulatedgreg/electron-vue my-project 安装electron-rebuild cnpm ins......

Chason-洪
今天
3
0
scala学习(一)

学习Spark之前需要学习Scala。 参考学习的书籍:快学Scala

柠檬果过
今天
3
0
通俗易懂解释网络工程中的技术,如STP,HSRP等

导读 在面试时,比如被问到HSRP的主备切换时间时多久,STP几个状态的停留时间,自己知道有这些东西,但在工作中不会经常用到,就老是记不住,觉得可能还是自己基础不够牢固,知识掌握不够全面...

问题终结者
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部