Head First 设计模式 --3 装饰者模式 开闭原则
装饰者模式:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比集成更有弹性的替代方案。
设计原则:
1:封装变化
2:多用组合,少用继承
3:针对接口编程,不针对实现编程
4:为对象之间的松耦合设计而努力
5:对修改关闭,对扩展开放
用Head First 设计模式中的例子。
一个咖啡店,会有各种类型的咖啡,还会给咖啡加上各种辅料,计算价钱的时候当然要加上辅料的价钱。
显然,可能不可能为每一种可能性的咖啡都写一个方法。类似于这种问题,就可以用到装饰者模式类解决。
直接看代码
abstract class Beverage {
String description = "Unkwnown Beverage"; public String getDescripion() {
return description;
} public abstract double cost();
} abstract class CondimentDecorator extends Beverage {
public abstract String getDescripion();
} class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
} @Override
public double cost() {
return 1.00;
}
} class HouseBlend extends Beverage {
public HouseBlend() {
description = "House Blend Coffee";
} @Override
public double cost() {
return 0.70;
}
} class Mocha extends CondimentDecorator {
Beverage beverage; public Mocha(Beverage beverage) {
this.beverage = beverage;
} @Override
public String getDescripion() {
return this.beverage.getDescripion() + ", Mocha";
} @Override
public double cost() {
return 0.20 + beverage.cost();
}
} public class Test {
public static void main(String[] args) {
Beverage beverage = new Espresso();
beverage = new Mocha(beverage);
beverage = new Mocha(beverage);
System.out.println(beverage.getDescripion() + "$" + beverage.cost());
}
}
类图:
这个例子上要表达的是什么意思?开始,咖啡只有一个cost方法,我们通过用装饰者模式给每种咖啡扩展了一个getDescription方法,同时又扩展了cost方法,现在这个cost方法是选择一个基础咖啡在继续加辅料把所有的钱加载一起。
设计原则:对修改关闭,对扩展开放(开闭原则)。
我们写代码的时候遵循设计原则固然是好的,但是不要为了遵循设计原则而去用设计原则,我们用这些原则的目的就是为了帮我们设计出更好代码,如果因为遵循了设计模式而让代码变的复杂,而且这个地方以后基本上也不会有什么扩展,那么就可以考虑不用这个设计模式。换句话说就是我们无法保证每个地方都应用设计模式,我们只需要在有可能改变的地方进行设计,而哪个是以后需要改变的地方,就看实际项目而定了。
还有一个之前说多的问题,组合优于继承,那么这个地方怎么还用到了继承。要明白,“组合优于继承”中的继承说的是利用集成获得了父类的行为(依赖继承)。而装饰者模式中用到的继承是未了让装饰者与被装饰者具有相同的类型(类型匹配),以便能让装饰者取代被装饰者。这里的行为来自装饰者(CondimentDecorator及其子类)和组件(各种咖啡)。如果是依赖继承,类的行为只能在编译时就决定。而装饰者模式可以在运行时,实现新的装饰者来增加新的行为。这里Beverage可以是一个抽象类,当然也可以设计成一个接口。
装饰者模式有能力为设计注入弹性,但是也有问题,上面的代码可以看到,会加入大量的类,而导致可能一般时候会看不懂。
Head First 设计模式 --3 装饰者模式 开闭原则的更多相关文章
- ZT 设计模式六大原则(6):开闭原则
ZT 设计模式六大原则(6):开闭原则 分类: 设计模式 2012-02-27 08:48 24870人阅读 评论(72) 收藏 举报 设计模式扩展框架编程测试 定义:一个软件实体如类.模块和函数应该 ...
- 【设计模式六大原则6】开闭原则(Open Close Principle)
定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不 ...
- 设计模式原则(6)--Open-Closed Principle(OCP)--开闭原则
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.定义: 一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码的情况下进行扩展. 2.使用场 ...
- 设计模式六大原则(六): 开闭原则(Open Closed Principle)
定义: 一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来: 在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不 ...
- java设计模式学习笔记--开闭原则
基本介绍 1.开闭(ocp)原则时编程中最基础.最重要的设计原则 2.一个软件实体如类.木块和函数应该对扩展开放,对修改关闭.用抽象构建框架,用实现扩展细节.即对提供方开放,对使用方关闭. 3.当软件 ...
- 设计原则:开-闭原则(Open-Closed Principle, OCP)
开-闭原则就是软件实体应当对扩展开放,对修改关闭.(Software entities should be open for extension,but closed for modification ...
- 开闭原则(Open Closed Principle,OCP)
遵循开闭原则设计出的模块具有两个主要特征: 对于扩展是开放的(Open for extension).这意味着模块的行为是可以扩展的.当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的 ...
- php设计模式八-----装饰器模式
1.介绍: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- Java设计模式 - - 单例模式 装饰者模式
Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...
随机推荐
- Java 生成验证码
package com.lf.testvity; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; im ...
- delphi之动态库调用和串口通讯
串口通讯: Spcomm 控件属性: CommName :表示COM1,COM2等串口的名字: BaudRate:设定波特率9600,4800等 StartComm StopComm 函数Write ...
- Salesforce select字段的多少对性能影响巨大
Salesforce select字段的多少对性能影响巨大,第1个是select 144个字段,第2个是select 5个字段, 性能相差了7倍 "select Id,IsDeleted,M ...
- JAVA多线程实现的三种方式
JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- svg学习(八)polyline
<polyline> 标签用来创建仅包含直线的形状. <?xml version="1.0" standalone="no"?> < ...
- Proofs without Words:Exercises in Visual Thinking(v.1 and v.2)
下面是手画的和拍的一些图片,出自标题中的那两本书,在图书馆草草浏览了半个小时,就把一眼能看出来的摘到这里了,再复杂一些的感觉违背了无字证明的初衷了,就没有摘录: 勾股定理: 希波克拉底定理: 无限步三 ...
- 使用@Configuration注解来代替Spring的bean配置
下面是一个典型的Spring配置文件(application-config.xml): <beans> <bean id="orderService" class ...
- Excel应该这么玩——4、命名区域:搞定下拉框
前三篇都是讲的给Excel元素命名,本篇再介绍一种命名的使用方式:命名区域.区域是多个单元格的集合,可以是单行.单列或者类似表格的单元格矩阵,也可以是不连续的多个单元格,但很少用到.当然,一个单元格也 ...
- Robotium自动化测试框架实用教程(图)
一.简介 Robotium是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击.长按.滑动等).查找和断言机制的API,能够对各 ...
- 前端开发面试题JS2
21.如何判断一个对象是否属于某个类? 使用instanceof if(a instanceof Person){ alert('yes'); } 22.new操作符具体干了什么呢? (1)创建一个空 ...