您的位置:首页 > 其它

学习设计模式 (二)(总结)

2016-03-05 15:26 267 查看

9.模板模式

模板模式:封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现。模板模式可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤。



templateMethod():模板步骤方法,定义了模板的执行的逻辑顺序。

AbsOperation():抽象方法,是由子类必须实现的。

concreteOp():具体方法,是由超类来实现的。

hook():可选方法,是指超类里实现了默认的方法,但子类里可以选择是否重写。

好莱坞原则:

原则:“不要给我们打电话,我们会给你打电话(don‘t
call us, we‘ll call you)”

意义:层次之间无需知道调用底层的细节,即增加一个调度的中间层来实现各个层次的解耦。

模板模式与策略模式的差异:

1.模板模式封装的是步骤,而策略模式主要是方法和功能的体系化不强调顺序。

2.模板模式是通过继承的方式来实现,而策略模式是通过组合的方式来实现的。

10.迭代器模式

迭代器模式:提供一种方法顺序访问一个聚合对象中的各个对象。

迭代器模式由以下角色组成:

迭代器角色(Iterator): 负责定义访问和遍历元素的接口。

具体迭代器角色(Concrete Iterator):实现迭代器接口,并要记录遍历中的当前位置。

容器角色(Aggregate): 负责提供创建具体迭代器角色的接口。

具体容器角色(ConcreteAggregate):实现创建具体迭代器角色的接口, 这个具体迭代器角色与该容器的结构相关。

类图:



单一责任原则:

一个类应该只有一个引起变化的原因。

11.组合模式

组合模式:将对象聚合成树形结构来表现"整体/部分"的层次结构。

组合模式能让客户以一致的方式来处理个别对象以及对象组合。



看下组合模式的组成。

1) 抽象构件角色Component:它为组合中的对象声明接口,也可以为共有接口实现缺省行为。

2) 树叶构件角色Leaf:在组合中表示叶节点对象——没有子节点,实现抽象构件角色声明的接口。

3) 树枝构件角色Composite:在组合中表示分支节点对象——有子节点,实现抽象构件角色声明的接口;存储子部件。

优缺点:

组合模式有以下优点:

1) 使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关心自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。

2) 更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。这一点符合开闭原则的要求,对系统的二次开发和功能扩展很有利!

当然组合模式也少不了缺点:组合模式不容易限制组合中的构件。

12.状态模式

状态模式:能根据内部状态的变化,改变对象的行为,看起来好像修改了类

解决的问题
主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。
模式中的角色
 1 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。
 2 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
 3 具体状态(Concrete State):实现抽象状态定义的接口。



策略模式、状态模式和模版模式的各自的意义:

1.状态模式和策略模式的差异:

状态模式和策略模式的维度是一样的;但他们的意义是不一样的。状态模式的状态的改变是目的的一部分;而策略模式的功能改变只是初始化可变化的行为,初始化行为之后功能基本不变。所以策略模式一般情况下可以作为状态模式的基础。

2.状态模式和模版模式的差异:

模版模式的动作是封装好的,每个动作是整体的一部分;而状态模式的动作都是一个整体。如果模板模式把每个动作拆开来封装成一个整体,就形成了状态模式。

13.代理模式

代理模式:为一个对象提供一个替身,以控制对这个对象访问。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。代理模式有很多变体,都是为了控制与管理对象访问。



类图:



常见的代理模式
虚拟代理:虚拟代理为创建开销大的对象提供代理服务。真正的对象在创建中时,由虚拟代理来扮演替身。
动态代理:运行时动态的创建代理类对象,并将方法调用转发到指定类。
保护代理:控制和管理代理可以调用的远程方法

其他的代理:防火墙代理、缓存代理、智能引用代理、同步代理、写入时复制代理。

代理模式和装饰者模式的差异
装饰者模式是添加新功能,而代理模式目的是对目标对象访问的控制和管理。

14.复合模式

复合模式:一个解决方案中结合两个或多个模式。


MVC复合模式

  Model-View-Controller :模型-视图-控制器,复合模式。

  MVC是由数个设计模式结合起来的模式。

  例子:MP3播放器。



M,Model模型:

  模型持有所有的数据、状态和程序逻辑。

  模型没有注意到视图和控制器,虽然它提供了操纵和检索状态的接口,并发送状态改变通知给观察者。

V,View 视图:

  视图用来呈现模型。

  视图通常直接从模型中取得它需要显示的状态与数据。

C,Controller 控制器:

  控制器取得用户的输入并解读其对模型的意思。

  控制器把控制逻辑从视图中分离,让模型和视图之间解耦。通过保持控制器和视图之间的松耦合,设计就更有弹性而且容易扩展。




MVC中的设计模式

  模型利用观察者模式让控制器和视图可以随最新的状态改变而更新。

  模型对视图和控制器一无所知,它们之间是完全解耦的,模型只知道有一些观察者它需要通知。模型还提供一些接口,供视图和控制器获得并设置状态。

  视图和控制器实现了策略模式。控制器是视图的行为,如果你希望有不同的行为,可以直接换一个控制器。

  视图内部使用组合模式来管理窗口、按钮以及其他显示组件。


15.桥接模式

桥接模式:将实现与抽象放在两个不同的层次中,使两个层次可以独立改变

结构图:



效果及实现要点

1.桥接模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。

2.所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意它们,从而获得不同路上的不同对象。

3.桥接模式有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。桥接模式是比多继承方案更好的解决方法。

4.桥接模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用桥接模式。

适用性:

在以下的情况下应当使用桥梁模式:

1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。

2.设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。

3.一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。

4.虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。

总结:

桥接模式是一个非常有用的模式,也非常复杂,它很好的符合了开放-封闭原则和优先使用对象,而不是继承这两个面向对象原则。

桥接模式与装饰的区别:

装饰模式:

这两个模式在一定程度上都是为了减少子类的数目,避免出现复杂的继承关系。但是它们解决的方法却各有不同,装饰模式把子类中比基类中多出来的部分放到单独的类里面,以适应新功能增加的需要,当我们把描述新功能的类封装到基类的对象里面时,就得到了所需要的子类对象,这些描述新功能的类通过组合可以实现很多的功能组合 .

桥接模式:

桥接模式则把原来的基类的实现化细节抽象出来,在构造到一个实现化的结构中,然后再把原来的基类改造成一个抽象化的等级结构,这样就可以实现系统在多个维度上的独立变化 。

策略模式与桥接模式的区别:
1.桥接的目的是让接口实现和抽象层可以分别演化,从而提高移植性; 策略的目的是将复杂的算法封装起来,从而便于替换不同的算法
2.桥接模式是往往是为了利用已有的方法或类;策略模式是为了扩展和修改,并提供动态配置
3.桥接模式强调接口对象仅提供基本操作;策略模式强调接口对象提供的是一种算法

16.生成器模式

生成器模式:封装一个复杂对象构造过程,并允许按步骤构造。
类图:



建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。

具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:

实现Builder角色提供的接口,一步一步完成创建产品实例的过程。
在建造过程完成后,提供产品的实例。

指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。

产品(Product)角色:产品便是建造中的复杂对象。

指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。
优点:
1.将复杂对象的创建过程封装起来。
2.允许对象通过几个步骤来创建,并且可以改变过程(工厂模式只有一个步骤)
3.只需指定具体生成器就能生成特点对象,隐藏类的内部结构
4.对象的实现可以被替换
生成器模式和抽象工厂的差异;
1.生成器一般用来创建大的复杂的对象
2.生成器模式强调的是一步步创建对象,可以改变步骤来生成不同的对象
3.一般来说生成器模式中对象不直接返回
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: