Java设计模式(疯狂Java联盟版)
public class ProxyObject implements Object {
Objec* obj;
public ProxyObject() {
System.out.println(\这是代理类\ o*j = new ObjectImpl(); }
public void ac*ion() {
System.out.p*intln(\代理开始\ obj.action*);
System.out.println(*代理结束\ } }
Subject
public interface Obje*t {
void action(); }
RealSubject
public class ObjectImpl implements Object {
pu*lic void action() {
System.out.println(\ System.out.println(\
System.out.pr*ntln(\这是被代理的类\ System.out.println(\ System.out.println(\ } }
Test
public class Test {
publi* static void main() {
Object ob* = new ProxyObject(); obj.action(); * }
result
35
Java设计模式(疯狂Java联盟版)
这是代理类 代理开始 ======== =*======
这是被代理的类 ======== ======*= 代理结束
1.3 行为型模式
Chain of Responsibility ( 责任链模式 ) Command ( 命令模式 ) Interpreter ( 解释器模式 ) Iterator ( 迭代器*式 ) Mediator ( 中介者模式 ) Memento ( 备忘录模式 ) Observer ( 观察者模式 ) State ( 状*模式 ) Strategy ( 策略模式 ) TemplateMethod ( 模板方法 ) Vis*tor ( 访问者模式 )
1.3.1 责任链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一*链,
并*着这条链传递该请求,直到有一个对象处理它为止。
这一模式的想法是,给多个对象处理一个请求的机会,从而解耦发送者和接受者.
适用性
1.有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2.你*在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3.可处理一个请求的对象集合应被动态指定。
参与者
36
Java设计模式(疯狂Java联盟版)
1.Handler
定义一个处理请求的接口。 (可选)实现后继链。
2.ConcreteHandler
处理它所负责的请*。 可访问它的后继者。
如果可处理该*求,就处理*;否则将该请求转发给它的后继者。
3.Client
向链上的具体处理者(ConcreteHandler)对象提交请求。
类图
例子 Hand*er
public interface RequestHandle {
void handleRequest(R*quest request); }
ConcreteHandler
public class HRRequestHandle implements RequestHandle {
public void handleRequest(Request request) { if (request instanceof DimissionRequest) { System.out.println(\要离职, 人事审批!\ }
System.out.println(\请求完*\ }
37
Java设计模式(疯狂Java联盟版)
}
public class PMRequestHandle implements RequestHandle {
Req*estHandle rh;
public PMRequestHandle(RequestHandle *h) { this.rh = rh; }
public void handle*equest(Request request) { if (request instanceof AddMoneyRequest) {
System.out.println(\要加薪, 项目经理审批!*); } else {
rh.handleRequest(request); } } }
public class TLRequestHandle implements RequestHandle {
RequestHandle rh;
public TLRequestHandle(RequestHand*e rh) { this.rh = rh; }
public void handleRequest(Request request) { if (request instanceof LeaveRe*uest) {
System.ou*.println(\要请假, 项目组长审批!\ } else {
rh.handleRequest(request); } } }
Client
public *lass Test {
public static v*id main(String[] args) {
RequestHa*dle hr = *ew HRRequ*stHandle(); Requ*stHandle pm = new P*RequestHandle(hr); RequestHandle tl = new TLRequestHandle(pm);
38
Java设计模式(疯狂Java联盟版)
//team leader处理离职请求
Request request = new DimissionRequest()* tl.handleRequest(request);
System.out.println(\ //team leader处理加薪请求
request = new AddMoneyRequest(); tl.handleRequ*st(request);
System.out.println(\ //项目经理上理辞职请求
requ*st = ne* Dimissio*Request(); pm.handleRequest(request); } }
result
要离职, 人事审批! 请求完毕 =======*===
要加薪, 项目经理审批! ========
要离职, 人事审批! 请求完毕
1.3.2 命令模式
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的*作。
适用性
1.抽象出待执行的动作以参数化某对象。
2.在不同的时刻指定、排列和执行请求。
3.支持取消操作。
4.支持修改日志,这样当系统崩溃时,这*修改可以被重做一遍。
5.用构建在原语操作上的高层操作构造一个系统。
参与者
39