《设计模式解析》读书笔记

 
Facade模式
GoF模式中的定义:
为子系统中的一组接口提供一个统一的接口。Facade模式定义了一个更高层的接口,使子系统更容易使用。
 
通过Facade,我们将以一种更简单的方式来使用原有系统。例如:以二维方式使用一个三维绘图程序,或者我们只需要使用原系统的一个子集。
 
Facade模式与CAD/CAM问题的联系
封装V1系统
 
小结
 
 
 
Adapter模式
 
GoF中的叙述:
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使原本由于接口不兼容而不能一起工作的类可以一起工作。
 
示例:
一个Shape基类,需要它的一个实现类Circle,要我自己实现这个Circle并不是一件容易的事情,幸运的是,Jill已经编写过
处理一个圆形的类,名为XXCircle。但我不能直接把这类加入我的继承体系中,因为XXCircle并没有实现Shape的方法并且
Jill不允许我修改XXCircle。我的处理方法只能是在XXCircle与Shape之间添加一个Adapter。
这个Adapter(Circle.class)继承了Shape并持有XXCircle的一个引用,在Adapter中实现Adapter和XXCircle的适配。
 
 
 
 
 
 
 
 
 
 
Adapter模式:关键特征
意图:使控制范围之外的一个原有对象与
 
 
 
Facade和Adapter的区别
Facade模式简化了接口,而Adapter模式则将一个已有接口转换成另一个接口。
Facade常常隐藏了多个类,而Adapter只隐藏了一个(但这并非本质差异)
 
策略模式
把Bridge模式去掉RefinedAbstraction就成了策略模式?
 
 
 
Bridge模式
 
GoF模式
将抽象与其实现解藕,使它们都可以独立地变化。
 
这里的实现指的是抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类)
 

示例

 
多个形状
多个绘图程序
 
 

解决方案

使用继承的设计

一个替代方案

Bridge解决方案

Shape对象只需要知道drow这个动作
Circle需要知道自己是画圆
Rectangle需要知道自己是画线
 
Drawing对象为外界统一提供drawLine,drawCircle方法
 
 
 
 
组合爆炸
 
封装:数据隐藏,封装变化
 
 
“一条规则,实现一次”,密切留意重构的可能性。
 
 
Bridge模式:关键特性
意图:将一组实现与另一组使用它们的对象分离
问题:一个抽象类的派生类必须使用多个实现,但不能出现类数量爆炸性的增长。
 
 

面向对象原则

对象对自己负责
抽象类
通过抽象类进行封装
一条规则,实现一次
可测试性
 
 
开拓视野
 
 
 
Abstract Factory模式
GoF叙述:
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类
 
方案1:使用switch
方案2:使用继承
方案3:使用抽象来代替switch语句
 
switch语句可能说明需要抽象
 
 
 
 
 
 
 
 
 
 
 
用模式思考

专家的设计之道

1.从对整体的概念性理解开始,以理解需要实现的目标。
2.找到在整体中出现的模式
3.从为其他模式创造背景的那些模式开始
4.从背景向内:应用这些模式,找到新模式,并重复。
5.最后,通过每次应用一个模式,改进设计,并在所创建的背景中予以实现。
 
用模式进行思考的过程
1.找出模式。在问题域中找出模式。
2.分析和应用模式。对于要进行分析的模式集合,执行步骤2a到2d。
2a.按背景的创造顺序将模式排序。
2b.选择模式并扩展设计。根据排序,选择列表中的下一个模式,用它得到最高层的概念设计。
2c.找到其他模式。
2d.重复。
3.添加细节
 
考虑背景时使用的一条规则
 
系统中的一个模式经常与其他模式相关——它为系统中的这些其他模式提供背景。
寻找背景是一种非常基本的工具
 
 
Abstract Factory模式创造了相关对象(族)的集合。
Adapter模式是已有的类A能够适配使用类(using class)B所需要的接口
Bridge模式允许一组相关的使用对象(using object,此模式中抽象的具体类)使用不同实现。
Facade模式能够为使用类B简化已有系统A
 
 
 
规则:先考虑系统中需要什么,然后再去关注如何创建它们。
所以我们应该确定了对象是什么之后再定义工厂。
 
 
从总体概念开始,然后不断添加特性。
 
迈向新的设计方式

开闭原则

模块、方法和类应该对扩展开放,对修改封闭。
完全遵守开闭原则几乎是不可能的,但它可以作为一个目标,指引正确的方向。

从背景设计原则

 

封装变化原则

我的设计中有一个相似之处:继承层次中类很少超过两层。那些层次更多的设计往往是因为有的设计模式的结构要求有两层作为派生类的基础。
如果我出现了多层继承,几乎总是为了消除某种冗余。

抽象类与接口

接口和抽象类的区别:就是抽象类允许有公共的状态和行为。
 
 

理性怀疑原则











分析矩阵
步骤:
1.找到某种特定情况中最重要的特性,并用矩阵将它们组织起来。用特性所表示的概念为每个特性标记。
2.继续处理其他情况,按需要扩展这个矩阵。处理每一情况时应该独立于其他情况。
3.用新的概念扩展该分析矩阵。
4. 用行发现规则。
5. 用列来发现特定情况。
6a.从这种分析中确定模式:观察行
6b.从这种分析中确定模式:观察列
7.得到高层设计。


Observer模式
模式的分类
创建型
结构型
行为型
解藕型
国际电子商务案例的新需求
1.向消费者发送一封欢迎邮件
2.向邮局查证消费者的地址
观察者(observer):
目标(subject):触发事件的对象,例如Customer。
观察者负责了解自己观察的是什么
目标无需知道有哪些观察者依赖于自己
必须在目标中添加两个方法
attach(Oberser):注册观察者
detach(Oberser):删除观察者
每个Oberser类都要实现一个名为update
Observer模式非常有用,以至于Java在其util包中就实现了Observer模式。
Observable类:扮演Subject角色
Observer接口:扮演Observer角色
attach:addObserver
detach:deleteObservers
notifyObservers:notifyObervers
Template Method模式
定义一个操作中算法的骨架,而将一些步骤延迟到子类中。不改变算法的结构而重新定义它的步骤。
各种工厂模式
工厂封装了创建对象的业务规则
工厂的含义
工厂是用来实例化其他对象的方法(静态或者非静态)、对象或者其他实体。
与工厂相关的模式(创建模式):
Abstract Factory
Builder
Factory Method
Prototype
Singleton
行为型模式用于封装行为的变化
结构型模式用于将已有的代码集成到新的面向对象设计中。
创建型模式用于管理对象的创建
工厂大背景:
规则:先考虑系统中需要什么,然后再去关注如何创建系统……也就是说。我们应该在确定了对象是什么以后再定义工厂。
工厂遵循我们的准则
开发分为以下两步的方法:
1.定义对象和它们的协作方式
2.编写为相应情况实例化对象并在对象共享时管理已有对象的工厂
步骤1中生成的代码无需操心哪个对象应该实例化,而步骤2中的代码则无需操心对象的协作方式。
规则:对象应该要么构造和/或管理其他对象,要么使用对象,而不应该兼而有之。
规则:先考虑系统中需要什么,然后再去关注如何创建系统……也就是说,我们应该在确定了对象是什么之后再定义工厂。
对象要么构造其他对象,要么使用其他对象,决不要两者兼顾
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值