设计模式学习(2)

来源:互联网 发布:社交大数据 编辑:程序博客网 时间:2024/06/08 20:14

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
这里写图片描述
抽象工厂模式
提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。

0 0