设计模式学习(2)

原创 2016年06月01日 18:09:21

3.装饰者模式

装饰者模式:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
设计原则:类应该对外扩展开放,对修改关闭。
现在以一个咖啡店为例介绍装饰者模式。这家咖啡店提供不同种类的咖啡,并且这些咖啡都可以加上不同种类的调料,不同的咖啡(或者调料)会有不同的价格,设计一个方案,可以简单完整的表示咖啡店的所有咖啡。
方案一:(思路最简单但维护最麻烦)
把不同的的调料和咖啡一 一 搭配,得到所有的类这里写图片描述
beverage是饮料的超类,每种咖啡都必须继承beverage,其中cost()方法需要具体类来实现。这种方案下,如果调料价格修改,需要对多个类进行修改,维护工作量太大。
方案二:(装饰者模式)
这里写图片描述
从类图中,我们可以看到整个系统结构清晰了很多。下面简要说明一下类图,Beverage是抽象的组件类,具体的组件都要继承这个类,并具体实现这个类下的cost()方法,condimentDecorator类继承Beverage不是为了获得它的方法,只是为了拥有Beverage的类型。Milk,Mocha…是具体的装饰者,每个装饰者在初始化时必须传入Beverage类型的被装饰者,所以可以传入组件,也可以传入装饰者,也就是说装饰者在装饰完一个对象后,还可以被下一个装饰者继续装饰,如此以来,程序就具有灵活性了。下面看一个具体装饰者的实现:
这里写图片描述
这样以来,如果想要制作一杯咖啡,可以选择具体咖啡的类型组件,然后需要什么调料就用这种调料装饰就可以了。

4.工厂模式

工厂模式还可以细分为3个不同的模式,简单工厂模式,工厂方法模式和抽象工厂模式。
下面还是以具体事例讲(这些事例都是Head first中的,直接拿来用了)
假设有一家pizza店,想要设计一个点餐系统。这家pizza店有不同种类的pizza可供选择,顾客可以在点餐时选择不同口味的pizza。
首先,你可能会想这么设计:

这里写图片描述
这样设计有什么问题呢?如果这么写程序的话,其实是在针对实现编程,把程序写死了。如果pizza店有新的口味的pizza,你需要重新修改if-else这段代码,如果某种pizza下架了,你也需要if-else这段代码。下面看看简单工厂模式怎么设计的吧。

简单工厂模式
这里写图片描述
这下我们有了制作pizza的工厂,所有pizza店就不用担心制作哪种口味的pizza了。
这里写图片描述
现在pizza店的类图是这样的。
这里写图片描述

工厂方法模式
由于这家pizza店的pizza销量特别好,现在有许多店想加盟。因为加盟店所处的地理位置不同,他们制作pizza的口味也会有所不同。但是最初的pizza店还想对加盟商制作pizza的过程加以控制。下面是设计思路:
先有一个pizzaStore抽象类,
这里写图片描述
这个类中已经规定了pizza的prepare,bake…等流程,但是pizza的口味,需要子类具体实现(也就是加盟商自己来处理)。下面看一下纽约口味的:
这里写图片描述
工厂方法模式
它定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类的实例化推迟到子类。

抽象工厂模式
现在pizza店想要控制加盟店的原料选择,以免偷工减料。
首先有一个抽象原料接口,
这里写图片描述
然后不同加盟店有自己的具体原料工厂,制作不同口味的调料。
以纽约为例:
这里写图片描述
重新制作pizza:
这里写图片描述
具体的pizza类:
这里写图片描述
最后是具体pizzaStore
这里写图片描述
抽象工厂模式
提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。

相关文章推荐

15. JAVA 反射机制 Part 2(动态代理、类的生命周期、工厂设计模式) ----- 学习笔记

 15.5 动态代理 15.6 类的生命周期 15.7 工厂设计模式         15.7.1 将反射应用在工厂模式上        ...

【学习笔记javascript设计模式与开发实践(this、call和apply)----2】

第2章this、call和apply 跟别的语言大相径庭的是,javascript的this总是指向一个对象,而具体指向哪个对象是运行时基于函数的执行环境动态绑定的,而非函数被声明时的环境。 ...

设计模式学习笔记 Chapter2

Chapter2——GRASP GRASP描述设计类的原则和如何分配类的功能。 1.Information Expert: 在设计类时,如果某个类能在某方面具有完整的信息,足以实现某个责任,就将...

C++ 学习 12 设计模式 2

工厂方法 抽象工厂 原型模式 构建器 单例模式 享元模式 门面模式 代理模式 适配器 中介者 对象创建模式通过对象创建模式绕开new,来避免对象创建(new),从而支持对象创建的稳定。它是接口抽象之后...

iOS学习2_代理设计模式

代理模式:一个对象让另一个对象替他执行一定的动作。 就是你想做一件事但不想自己去做,你就需要制定一个代理,让这个代理帮忙去做,体现在代码上就是声明一个代理对象作为成员变量。需要作某些事情的时候调用该...

Javascript 设计模式学习笔记(2) - 继承(Inheritance) (上)

继承(Inheritance) Javascript 继承很复杂, 比其它任何面向对象语言都复杂. Javascript 是少数使用 原型式继承 的语言之一, 这也正是 Javascript 的优点...

JavaScript设计模式学习笔记2

上篇有些设计模式没说道,一方面是我没见到,一方面是我不太理解。今天再说说其他的几种设计模式: 1.代理模式 就是我把一件事交给专门的一个处理程序去做。 比如下面这个例子:var keyMgr =...
  • sufubo
  • sufubo
  • 2016年01月29日 21:35
  • 225

IOS设计模式学习(2)热身

1 前言 这节我们将用一个简单的应用:绘图应用,我们叫他TouchPainter。来展示设计模式和最佳做法,希望能从中得到启发。 2 详述 2.1 设计过程中的3个重要里程碑 2.1.1 想法...

Javascript 设计模式学习笔记(2) - 继承(Inheritance) (下)

继承(Inheritance) (三) 原型式继承 原型式继承与类式继承截然不同, 个人感觉比类型继承简单得多, 类式继承 每个实例中都有类的实例属性的一份副本, 实例方法只存在一份 原型式继承...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式学习(2)
举报原因:
原因补充:

(最多只允许输入30个字)