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(\请求完*\ } }
36
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);
37
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.用构建在原语操作上的高层操作构造一个系统。
参与者
38
Java设计模式(疯狂Java联盟版)
1.Comma*d
声明执行操作的接口。
2.ConcreteCommand
将一个接收者对象绑定于一个动作。
调用接收者相应的操作,以实现Execute。
3.Client
创建一个具体命令对象并设定它的接收者。
4.Invoker
要求该命令执行这个请求。
5.Recei*er
知道如何实*与执行一个请求相关的操作。任何类都可能作为一个接收者。
类图
例子 Command
public abstract class *ommand {
protecte* Receiver receiver;
public Command(Receiver re*eiver) { this.receiver = receiver; }
public abstract *oid execute();
39
Java设计模式(疯狂Java联盟版)
}
ConcreteCommand
public class CommandImpl extends Comman* {
public CommandImpl(Receiv*r receiver) { super(receiver); }
pu*lic void *xecute*) { receiver.request(); } }
Invoker
public cl*ss Invoker {
private Command command;
pub*ic void setCommand(Command c*mmand) { this.command = command; }
public void execute*) { command.execute(); } }
Receiver
public class Receiver {
public void receive() {
S*stem.out.println(\ } }
Test
publ*c class Test {
pub*ic static void main*String[] args) { R*ceiver rec = new Receiver();
Command cmd = n*w CommandImpl(rec); Invoker i = new Invoker(); i.setCom*and(cmd);
40