设计模式纵谈-Decarator,Facade,FlyWeight,Template Method,Command

来源:互联网 发布:吉诺比利04奥运会数据 编辑:程序博客网 时间:2024/06/15 05:52

10 Decarator

子类复子类,子类何其多

假如我们需要为游戏开发开发一种坦克,除了各种不同型号的坦克外,
我们还希望在不同场合中为其增加以下一种或多种功能:比如红外线夜视
功能,比如卫星定位等等。

Motivation

上述描述的问题根源在于我们 过度地使用了继承扩展对象的功能,
由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着
子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致
更多子类的膨胀。

如何使 对象功能的扩展 能够根据需要来动态地实现?同时避免 扩展功能
的增多 带来的子类膨胀问题?从而使得任何 功能扩展变化 所导致
的影响将为最低?


Intent
动态地给衣蛾对象增加一些额外的职责。就增加功能而言。
Decaorator模式比生成子类更为灵活。

注意接口继承和实现继承(is-a) 具体类之间

is-a继承  里氏替换原则。

设计模式不是固定死的。。而是灵活变化的。。
不一定要满足基本的模式结构图。

设计模式是解决某个方向变化的。。封装变化。。隔离变化。。


11 Facade模式


动态的分析系统。。。而不是静态的看系统。

软件在动态和静态中的考虑是完全不一样的。(加上时间轴)

时间 对于软件系统的重要性。

变化是基于动态的。

高层是稳定的,底层实现细节是易变化的。

子系统是它们之间的关系很紧,变化轴线和变化方法是一致的。

 

所有的模式都是封装变化,为什么会有变化,因为时间会变化,
时间会变化导致需求而变化。

动态环境的变化。 

12FlyWeight

面向对象的代价

面向对象很好地解决了系统抽象性的问题。

13Proxy代理 结构型模式

直接与间接
人们对于复杂的软件系统常常有一种处理手法,即增加一层间接层,从而
对系统获得一种更为灵活,满足特定需求的解决方法。

Motivation
在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,
或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者
,或者系统结构带来很多麻烦。

如何在不失去透明性操作对象的同时来管理控制这些特有的复杂性?
增加一层间接层是软件开发常见的解决方式。

Intent
为其他对象提供一种代理以控制对这个对象的访问。

Proxy模式的几个要点
.增加一层间接层是软件系统中对许多复杂问题的一种常见解决方案。
在面向对象系统中,直接诶使用某些对象会带来很多问题,作为
间接层的proxy对象便是解决这一问题的常用手段。

.具体proxy设计模式的实现方法,实现粒度都相差很大,有些可能对单个对象做细粒
控制,如copy-on-write技术,有些可能对最佳模块提供抽象代理层,
在架构层次对对象做proxy.

.proxy并不一定要求保持接口的一致性,只要能够实现间接层控制,
有时候损及一些透明性是可以接受的。


14Template Method模板方法

Simple is beautiful

变与不变

变化--是软件设计的永恒的主题,如果管理变化带来的复杂性?
设计模式的艺术性和复杂度就在于如何分析,并发现系统中变化点
和稳定点,并使用特点的设计方法应对这种变化。

技术要具体的去体会,去想,去思考 而不是表面。


Motivation
在软件构件过程中,对于某一项任务,它常常有稳定的整体操作结构,
但各个子步骤却又很多改变的需求,或者由于固有原因(比如框架与应用之间的关系)
而无法和任务的整体结构同时实现。

如果确定稳定操作结构前提下,来灵活应对各个子步骤的变化火族晚期实现需求

变化和不变化 稳定和不稳定.

dont't call me ,i will call you.


15Command

Motivation
在软件构建过程中,行为请求者与行为实现者通常呈现一种紧耦合。但在某些场合
比如需要对行为进行记录,撤销/重做,事务等处理,这种无法抵御变化的紧耦合是不合适的。

直接依赖变为间接依赖。

A依赖B  依赖间接层 间接的抽象层

******抽象*******
关注重要点而不是细节。
《1》抽取公共部分
《2》抽取重要部分

抽象行为的实现者。

Intent
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录
日志,以及至支持可撤销的操作。

依赖关系的转换。

代码时形式,解耦,依赖转换是目的。

Command模式的几个要点
.Command模式的根本目的在于将 行为请求者 与 行为实现者解耦,在面向
对象的语言中,常见的实现手段是 将行为抽象为对象。

.实现Command接口的具体命令对象ConcreteCommand有时候根据需要可能会保存
一些额外的状态信息。

.通过使用Composite模式,可以将多个命令封装为一个复合命令

.Command模式与c#中的Delegate有些类似。但两者定义行为接口的规范有所
区别:Command以面向镀锡中的接口-实现来定义行为接口规范,更严格,
更复合抽象原则。Delegate以函数签名来定义行为接口规范,更灵活,
但抽象能力比较弱。

抽象,封装变化,隔离变化,耦合,依赖。

抽象能力。

分析依赖关系。


抽象,封装变化,隔离变化,依赖关系。

 

 

 

 

 

 

原创粉丝点击