继续接着上回行为型模式,我们再说说它的拟人化模型——观察者模式,状态模式,解释器模式和策略模式。从
这四个设计模式的名称上即可知道他们拥有同人一样的观察能力,心理状态,遇到问题获得解释、策略的能力。下
面我们从他们四个具体的性质来说明一下他们是怎么“拟人化”的。
题 对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式——打小报告
呵呵,我给观察者起了一个小外号——打小报告的人。从书上的例子知道,那个前台秘书就是个打小报告的人。
来看看观察者模式的定义:它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。这个主
它的结果图如下:
在结构图中,前台秘书就是ConcreteObserver,她把大Boss的最新状态提供给员工知道。
而观察者模式主要用于当一个对象的改变需要同时改变其他对象,且不知道具体有多少对象需要改变的时候。还
有它可以将两个具有依赖关系的对象封装在独立的对象中使它们各自独立地改变和复用。它的主要工作就是在解耦,
让耦合的双方都依赖于抽象而不是具体。
以还是有一定的弊端。所以 我们引出了 委托 。观察者缺点:虽然观察者的目标是解耦,但是它还是依赖于观察者这个具体对象(改:依赖于抽象观察者),所
委托就是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用
可以像其他任何方法一样,具有参数和返回值。委托可以看作是对函数的抽象,是函数的“类”,委托的实例将代表
一个具体的函数。也就是书上说的:本来在“老板”类中的增加和减少的抽象观察者集合记忆通知时遍历的抽象观察
者都不必要了。只要在客户端多委托搭载几个方法就解决了!
状态模式——情绪化
它的定义是:当一个对象的内在状态改变时允许改变其行为,这个对象看起来是改变了其类。它主要解决的是当
控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可
以把复杂的判断逻辑简化。
它的结构图如下:
模式。书上的实例为工作一天中随时间的心理状态,从早上、中午、下午、晚上每个时间段员工的工作状态。根据状态模式的结构图和定义我们可以知道,这就是一个人的基本心理活动状态,所以可以用情绪化来理解这个
依赖。状态模式的目的是为了消除庞大的条件分支语句,通过把各种状态转移逻辑分布到State子类间,减少相互间的
什么时候使用状态模式?当一个对象的行为取决于它的状态,并且必须在运行时刻根据状态改变行为时,就可以
用状态模式了。像员工加班的状态很不好,效率不高,这种时候就可以减少加班的时间,尽量在工作时间内完成工作
任务。
解释器模式——还是翻译
记得在结构型模式中提到的适配器模式讲到翻译的作用,这里的解释器也具有翻译作用,来看看他们有什么不同
的地方吧!
来看看解释器模式的定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表
示来解释语言中的句子。
而不能一起工作的那些 类可以一起工作。在对比一下看看适配器模式的定义:将一个类的接口转换成客户希望的另一个接口。它使得原本由于接口不兼容
从定义中能够看出他们的基本原理都是相同的,通过接口,使目标对象明白想要表达的意思。不过也能看出不同
点:解释器模式主要是解释语言文法表示来解决问题;而适配器主要解决的是对象与对象间的一种兼容性问题。
再看看解释器模式的结构图:
地改变和扩展文法。解释器的好处是:当有一个语言需要解释执行,它可以将该语言中的句子表示为一个抽象语法树。这样就很容易
护。建议当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理。它的不足:解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维
策略模式——商场促销
策略模式主要定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使
用算法的客户。
它的结构图如下:
策略模式是一种定义了一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不
同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。而策略模式的Strategy类层
次为Context定义了一系列的可供重用的算法或行为。而ConcreteStrategy继承有助于析取出这些算法中的公共功
能。
策略模式的优点是简化了一个单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。它就是用
来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则。所以即使需求发生变化,变动也会很
小。
总结
上述是行为型模式中的“拟人化模式”的简单介绍。总结来说,他们就是把人的情绪演绎的淋漓尽致,拥有和人
一样的情绪。这样的总结让我觉得是比较轻松的,终于知道什么叫联系生活了,因为所有的设计都是出自人,都是以
人的需求为目标。所以这样想的话,联系就很好找了。马上就要进入自考学习了,希望第二次自考,不慌乱,慢慢
来,不就是联系吗!!!