设计模式学习(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
抽象工厂模式
提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。
- 设计模式 学习 2:
- 设计模式学习(2)
- 模式设计学习(2)
- 设计模式学习(2)
- 设计模式学习---(2)
- 设计模式学习2 -- 工厂模式
- 设计模式学习2-创建模式
- 设计模式学习(2)工厂模式,抽象工厂模式
- 设计模式学习--设计原则
- 设计模式学习--适配器模式
- 设计模式学习--观察者模式
- 设计模式学习--命令模式
- 策略模式--设计模式学习
- 设计模式学习----Builder模式
- 设计模式学习----外观模式
- 设计模式学习----代理模式
- 设计模式学习----装饰模式
- 设计模式学习----Memento模式
- DB2批量跑sql文件
- Oracle:记录被另一个用户锁住
- 杂记录---sift学习
- Android:screenOrientation设定屏幕旋转方向
- java源码分析(5)-StringBuilder
- 设计模式学习(2)
- JVM理解其实并不难!
- OpenglES2.0 for Android:来画个矩形吧
- 将数据划分为训练数据及测试数据(div_train_val.py 解析)
- 【公司简介】之腾讯
- No such file or directory: 解决方法
- Android中颜色的设置
- 浏览器跟js交互、NPAPI之NPRuntime开发
- An App ID with Identifier "bundle id名字"is not available