Java Design Pattern(3)

来源:互联网 发布:挑选墙布 知乎 编辑:程序博客网 时间:2024/04/28 15:06

1、TIPS

(1)命令模式

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


采用命令模式的解决方案:


Command:定义命令的接口,声明执行的方法;

ConcreteCommand:命令接口实现对象:通常会持有接收者,并调用接收者的功能来完成命令要执行的功能;

Receiver:接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能实现命令要求实现的相应功能;

Invoker:要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,相当于使用命令对象的入口是提供给客户使用的

Client:创建具体的命令对象,并设置命令对象的接收者。注:这个不是常规意义上的客户端,而是在组装命令对象和接收者。把这个Client称为装配者更好理解,因为真正使用命令的客户端是从Invoker来触发执行。


命令模式:

a、把请求封装成为命令对象,并定义了统一的执行操作的接口。

b、真正的用户通过Invoker触发命令。

c、命令模式的接收者知道如何真正执行命令的操作。


命令模式的调用顺序图:

使用命令模式分为两个阶段:一个阶段是组装命令对象和接收者对象的过程;另外一个阶段是触发调用Invoker,来让命令真正执行的过程。

a、命令模式组装过程的调用顺序图:


b、命令模式执行过程的调用顺序图:



命令模式的参数化配置:可以用不同的命令对象,去参数化配置客户的请求;



命令模式的优点:

a、命令模式使得发起命令的对象——客户端,和具体实现命令的对象——接收者对象完全解耦。

b、扩展新命令很容易。只需要实现新的命令对象,然后在装配时,把具体的实现对象设置到命令对象中,然后就可以使用这个命令对象,已有的实现完全不用变化。


命令模式的本质:封装请求;

命令模式的关键就是把请求封装为命令对象,然后就可以对这个对象进行一系列的处理了。


(2)观察者模式

定义:定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。


解决问题:

当一个对象的状态发生改变时,让依赖于它的所有对象得到通知,并进行相应的处理。


采用观察者模式的解决方案:


Subject:目标对象。一个目标可以被多个观察者观察;目标提供对观察者注册和退订的维护;当目标的状态发生变化时,目标负责通知所有注册的、有效的观察者。

Observer:观察者接口。提供目标通知时对应的更新方法,这个更新方法进行相应的业务处理,可以在这个方法里回调目标对象,以获取目标对象的数据。

ConcreteSubject:具体的目标实现对象,用来维护目标状态,当目标对象的状态发生改变时,通知所有注册的、有效的观察者,让观察者执行相应的处理。

ConcreteObserver:观察者的具体实现对象,用来接收目标的通知,并进行相应的后续处理,比如更新自身的状态以保持和目标的相应状态一致。


一个观察者也可以观察多个目标。一般情况下,观察者应该为不同的观察者目标定义不同的回调方法。


单向依赖

在观察者模式中,观察者和目标是单向依赖的,只有观察者依赖于目标,而目标是不会依赖于观察者的。


命名建议:

观察者模式又被称为发布——订阅模式。

目标接口的定义,建议在名称后面加Subject;观察者接口的定义,建议在名称后面加Observer;观察者接口的更新方法,建议名称为update。


触发通知的时机:

一般情况下,是在完成了状态维护后触发。


观察者模式准备阶段示意图:



观察者模式运行阶段示意图:



推模型:

目标对象主动向观察者推送目标的详细信息,不管观察者是否需要,推送的信息通常是目标对象的全部或部分数据,相当于是在广播通信。


拉模型:

目标对象在通知观察者时,由观察者主动到目标对象中获取,相当于是观察者从目标对象中拉数据。一般会把目标对象自身通过update方法传递给观察者,这样在观察者需要获取数据时,就可以通过这个引用来获取了。


观察者模式的优点:

a、观察者模式实现了观察者和目标之间的抽象耦合;

b、观察者模式实现了动态联动;

c、观察者模式支持广播通信;


观察者模式的缺点:

a、可能会引用无谓的操作。


观察者模式的本质:触发联动。

当修改目标对象的状态时,就会触发相应的通知,然后会循环调用所有注册的观察者对象的相应方法,其实就相当于联动调用这些观察者的方法。


何时选用观察者模式:

a、当一个抽象模型有两个方面,其中一个方面的操作依赖于另一个方面的状态变化,那么就可以选用观察者模式。将这两者封装成观察者和目标对象,当目标对象变化时,依赖于它的观察者对象也会发生相应的变化。

b、若在更改一个对象时,需要同时连带改变其他的对象,且不知道究竟应该有多少对象需要被连带改变,这种情况可以选用观察者模式。

c、当一个对象必须通知其他的对象,但你又希望这个对象和其它被它通知的对象是松散耦合的。此时可以选用观察者模式。



(3)原型模式


(4)享元模式


(5)组合模式

2、PS

(1)

(2)