u 代理模式
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
通俗讲就是无论是目标对象还是客户端都是在与代理进行交流,代理是目标对象和客户端的一个传信人,实现了他们之间的交流。
u 外观模式
为子系统提供中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
对比,以书上使用外观模式前后对比。
使用前:
使用后:
使用后使得本来客户必须和各种股票打交道,现在只需要和基金打交道就行。基金封装了各种股票的属性和方法,使得不必和股票直接联系,而和第三方也就是中介联系即可,其中外观封装了子类的方法和属性,使得某些东西依赖于抽象而非细节,也就是依赖倒转原则(上一篇已讲)。此外还有就是中介(第三方基金)出现,这体现的是有一个新的原则,迪米特法则。
那么什么是迪米特法则呢?
迪米特法则(LOD):如果两个类不必彼此通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三方转发这个调用。
比如,你去到一个新公司,你的电脑需要配置,这时你不必自己去找某个特定的负责修电脑的人,因为你不认识他们,但是你可以报告给总经理或者总管,让他给安排相应的人,毕竟他认识的管的面还是宽的,通过第三方来实现自己的某种目的,便是迪米特原则。
u 观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变的时候,会通知所有观察者对象,使它们能够自动更新自己。
比如自然界中这一现象是很普遍的,大自然的弱肉强食,使得动物们对于安全觅食很在乎。我们经常可以在电视上看见,动物觅食的时候,通常有一个人是在站岗放哨的,其作用就是当有外敌来临时,会发出相应的信号,使得同伴们能够及时逃离或者应对敌人来袭,其实生活中随处可见这种模式。其也是通过第三方来传达的。
u 中介者模式
中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以互相独立地改变它们之间的交互。
比如大学校园里找兼职,通常会有这样一个组织或者网站会为你提供一个职位,这时你只需要把自己的信息交给它们,它们会联系另一方,如果另一方有需要,便可以由第三方也就是这个组织把另一方的需要告诉你,你便可以得到工作的机会。简单言之,你要找工作,另一方,我们要雇人工作,第三方也就是中介负责传达这些信息,并且协调里面的利益关系。这便是中介者模式。这也体现了上面讲的“迪米特法则”。
u 小结
这四种模式有一个共同的特点,那就是都借助于第三方,这也是我为什么把它们放一起的原因,也就是它们之间相互区别又相互联系。
代理模式:其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途,实质上代理就是真实对象的代表。
比如《大话设计模式》中的举例,简言之,A想要追求B并且送礼物给B,但是A、B并不认识,这时A与B的交流便可以通过C来实现。此时C就是A的一个代表,代表了A的想法和行动,也就是封装了A所有的属性和方法。
外观模式:A想要去a地旅游,需要买票,乘车;还想去b地,同样地买票,乘车,c地也一样, 同样的手续,,可能有时还需要住宿等等。但是我们现在可以把这一系列的手续交给旅行社,让旅行社来实现。这时旅行社可以帮助我们买票、预定车和预订房间等等,我们只需要交付相应的钱。这时旅行社就把要去旅游地的所有手续全部给封装了,也就是封装了a、b、c地的属性和方法,这样客户只需要和旅行社打交道就可以实现自己想做的事情。降低了客户和目的地的耦合性。
观察者模式:甲、乙、丙、丁,同时关注某一主题对象,主题的状态发生改变,通知观察者改变,使得他们自己更新自己的行为。这样使得观察者不依赖于具体,而依赖于抽象。
日常生活中我们常常驾驶车辆出外,马路上随处可见的就是红绿灯,在红绿灯,同时我们也可以看到有交警在路上指挥交通,其实交警就是一个通知者,但是由于交警的形体大小有限,那么能够看得见他的人就有限,也就是交警纳入他管辖范围内的人在一定时间或者空间是有限的,这样难免会有人因为接收不到通知而违反交通规则,随后的交通灯便弥补了这一不足,它的视野宽泛,只要在能够看见它,并可以规范自己的行为,而不必等着被固定指挥,可能某天交警不指挥,这时交通灯便是充当一个委托,即使远方的司机看不见交警的通知,但是交通灯就可以实现,它不用管司机与交警之间可不可以相互识别,就可以通知司机。它与交警有着同样的行为。
中介模式:农村的相亲,A、B通过媒婆来表达自己对于对方的第一感受,双方可以是不认识的,但是媒婆可以为他们传送话语,这样就降低了A、B之间的耦合性。
代理模式主要是对于一个对象来说的,外观模式针对的是封装于外观的子类。观察者模式把通知集中在一个抽象接口或者类中,只要有一个具体的实例即可。而中介者模式调和中介一般情况下是一个,的子类可以是多个。