《Java设计模式--------行为模式和总结.pdf》由会员分享,可在线阅读,更多相关《Java设计模式--------行为模式和总结.pdf(157页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、责任链模式责任链模式 2011-11-291责任链模式责任链模式使多个对象都有机会处理请求,从而避免请求的发送者使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。沿着这条链传递该请求,直到有一个对象处理它为止。Chain of Responsibility Pattern Chain of Responsibility Pattern Chain of Responsibility Pattern Chain of Responsibility Patt
2、ern Avoid coupling the sender of a request to its Avoid coupling the sender of a request to its Avoid coupling the sender of a request to its Avoid coupling the sender of a request to its receiver by giving more than one object a chance receiver by giving more than one object a chance receiver by gi
3、ving more than one object a chance receiver by giving more than one object a chance to handle the request.Chain the receiving objects to handle the request.Chain the receiving objects to handle the request.Chain the receiving objects to handle the request.Chain the receiving objects and pass the req
4、uest along the chain until an and pass the request along the chain until an and pass the request along the chain until an and pass the request along the chain until an object handles it.object handles it.object handles it.object handles it.概概 述述 2011-11-292 使多个对象都有机会处理请求,从而避免请求使多个对象都有机会处理请求,从而避免请求的发
5、送者和接收者之间的耦合关系。将这些对象连的发送者和接收者之间的耦合关系。将这些对象连成一条链,这条链传递该请求,直到有一个对象处成一条链,这条链传递该请求,直到有一个对象处理它为止。这一模式的想法是,给多个对象处理一理它为止。这一模式的想法是,给多个对象处理一个请求的机会,从而解耦发送者和接受者个请求的机会,从而解耦发送者和接受者.责任链模式的结构与使用责任链模式的结构与使用 2011-11-293模式的结构中包括两种角色:模式的结构中包括两种角色:处理者(处理者(HandlerHandler)具体处理者(具体处理者(ConcreteHandlerConcreteHandler)2011-11
6、-294模式的模式的UMLUML类图类图 参与者1.Handler 定义一个处理请求的接口。实现后继链。2.ConcreteHandler 处理它所负责的请求。可访问它的后继者。如果可处理该请求,就处理;否则将该请求转发给它的后继者。3.Client 向链上的具体处理者(ConcreteHandler)对象提交请求。2011-11-296模式的结构的描述与使用模式的结构的描述与使用 1 1处理者(处理者(HandlerHandler):Handler.java Handler.java public interface Handlerpublic interface Handler publi
7、c abstract void handleRequest(String number);public abstract void handleRequest(String number);public abstract void setNextHandler(Handler handler);public abstract void setNextHandler(Handler handler);2011-11-297模式的结构的描述与使用模式的结构的描述与使用 2 2具体处理者(具体处理者(ConcreteHandlerConcreteHandler)_1:_1:Beijing.java
8、Beijing.java import java.util.import java.util.*;public class Beijing implements Handlerpublic class Beijing implements Handler private Handler handler;private Handler handler;private ArrayList numberList;private ArrayList numberList;Beijing()Beijing()numberList=new ArrayList();numberList=new ArrayL
9、ist();numberList.add(11129812340930034);numberList.add(11129812340930034);numberList.add(10120810340930632);numberList.add(10120810340930632);numberList.add(22029812340930034);numberList.add(22029812340930034);numberList.add(32620810340930632);numberList.add(32620810340930632);public void handleRequ
10、est(String number)public void handleRequest(String number)if(numberList.contains(number)if(numberList.contains(number)System.out.println(System.out.println(该人在北京居住该人在北京居住););else else System.out.println(System.out.println(该人不在北京居住该人不在北京居住););if(handler!=null)if(handler!=null)handler.handleRequest(nu
11、mber);handler.handleRequest(number);public void setNextHandler(Handler handler)public void setNextHandler(Handler handler)this.handler=handler;this.handler=handler;2011-11-298模式的结构的描述与使用模式的结构的描述与使用 2 2具体处理者(具体处理者(ConcreteHandlerConcreteHandler)_2:_2:Shanghai.java Shanghai.java import java.util.impor
12、t java.util.*;public class Shanghai implements Handlerpublic class Shanghai implements Handler private Handler handler;private Handler handler;private ArrayList numberList;private ArrayList numberList;Shanghai()Shanghai()numberList=new ArrayList();numberList=new ArrayList();numberList.add(3452981234
13、0930034);numberList.add(34529812340930034);numberList.add(98720810340430632);numberList.add(98720810340430632);numberList.add(36529812340930034);numberList.add(36529812340930034);numberList.add(77720810340930632);numberList.add(77720810340930632);public void handleRequest(String number)public void h
14、andleRequest(String number)if(numberList.contains(number)if(numberList.contains(number)System.out.println(System.out.println(该人在上海居住该人在上海居住););else else System.out.println(System.out.println(该人不在上海居住该人不在上海居住););if(handler!=null)if(handler!=null)handler.handleRequest(number);handler.handleRequest(num
15、ber);public void setNextHandler(Handler handler)public void setNextHandler(Handler handler)this.handler=handler;this.handler=handler;2011-11-299模式的结构的描述与使用模式的结构的描述与使用 2 2具体处理者(具体处理者(ConcreteHandlerConcreteHandler)_3:_3:Tianjin.java Tianjin.java import java.util.import java.util.*;public class Tianji
16、n implements Handlerpublic class Tianjin implements Handler private Handler handler;private Handler handler;private ArrayList numberList;private ArrayList numberList;Tianjin()Tianjin()numberList=new ArrayList();numberList=new ArrayList();numberList.add(10029812340930034);numberList.add(1002981234093
17、0034);numberList.add(20020810340430632);numberList.add(20020810340430632);numberList.add(30029812340930034);numberList.add(30029812340930034);numberList.add(50020810340930632);numberList.add(50020810340930632);public void handleRequest(String number)public void handleRequest(String number)if(numberL
18、ist.contains(number)if(numberList.contains(number)System.out.println(System.out.println(该人在天津居住该人在天津居住););else else System.out.println(System.out.println(该人不在天津居住该人不在天津居住););if(handler!=null)if(handler!=null)handler.handleRequest(number);handler.handleRequest(number);public void setNextHandler(Handl
19、er handler)public void setNextHandler(Handler handler)this.handler=handler;this.handler=handler;2011-11-2910模式的结构的描述与使用模式的结构的描述与使用 3 3应用应用 Application.javaApplication.java public class Applicationpublic class Application private Handler beijing,shanghai,tianjin;private Handler beijing,shanghai,tianj
20、in;public void createChain()public void createChain()beijing=new Beijing();beijing=new Beijing();shanghai=new Shanghai();shanghai=new Shanghai();tianjin=new Tianjin();tianjin=new Tianjin();beijing.setNextHandler(shanghai);beijing.setNextHandler(shanghai);shanghai.setNextHandler(tianjin);shanghai.set
21、NextHandler(tianjin);public void reponseClient(String number)public void reponseClient(String number)beijing.handleRequest(number);beijing.handleRequest(number);public static void main(String args)public static void main(String args)Application application=new Application();Application application=n
22、ew Application();application.createChain();application.createChain();application.reponseClient(77720810340930632);application.reponseClient(77720810340930632);责任链模式的优点责任链模式的优点 2011-11-2911责任链中的对象只和自己的后继是低耦合关系,和其他对象毫无关联,这使得编写处理者对象以及创建责任链变得非常容易。当在处理者中分配职责时,责任链给应用程序更多的灵活性。应用程序可以动态地增加、删除处理者或重新指派处理者的职责。应
23、用程序可以动态地改变处理者之间的先后顺序。使用责任链的用户不必知道处理者的信息,用户不会知道到底是哪个对象处理了它的请求。适用性1.有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。2.在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。3.可处理一个请求的对象集合应被动态指定。命令模式命令模式 2011-11-2913命令模式(别名:动作,事务)命令模式(别名:动作,事务)将一个请求封装为一个对象,从而可用不同的请求对客将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤户进行参数化;对请求排队或记录请求日志,以及支持可
24、撤消的操作。消的操作。Command Pattern(Another Name:Action,Transaction)Command Pattern(Another Name:Action,Transaction)Command Pattern(Another Name:Action,Transaction)Command Pattern(Another Name:Action,Transaction)Encapsulate a request as an object,thereby letting you parameterize clients with different reques
25、ts,queue or log requests,and support undoable operations.概述概述 14 在许多设计中,经常涉及到一个对象请求另一个对象调用其方法到达某种目的在许多设计中,经常涉及到一个对象请求另一个对象调用其方法到达某种目的。如果请求者不希望或无法直接和被请求者打交道,即不希望或无法含有被请求者。如果请求者不希望或无法直接和被请求者打交道,即不希望或无法含有被请求者的引用,那么就可以使用命令模式。的引用,那么就可以使用命令模式。命令模式的结构与使用命令模式的结构与使用 2011-11-2915模式的结构中包括四种角色:模式的结构中包括四种角色:接收者(
26、接收者(ReceiverReceiver)命令命令(Command)(Command)接口接口 具体命令(具体命令(ConcreteCommandConcreteCommand)请求者(请求者(InvokerInvoker)2011-11-2916模式的模式的UMLUML类图类图 参与者参与者1.Command 声明执行操作的接口。2.ConcreteCommand 将一个接收者对象绑定于一个动作。调用接收者相应的操作,以实现Execute。3.Client 创建一个具体命令对象并设定它的接收者。4.Invoker 要求该命令执行这个请求。5.Receiver 知道如何实现与执行一个请求相关的
27、操作。任何类都可能作为一个接收者。2011-11-2918举举 例例1 1接收者(接收者(ReceiverReceiver):CompanyArmy.javaCompanyArmy.javapublic class CompanyArmypublic class CompanyArmy public void sneakAttack()public void sneakAttack()System.out.println(System.out.println(知道如何偷袭敌人知道如何偷袭敌人,保证完成任务保证完成任务););2011-11-29192 2命令(命令(CommandCommand
28、)接口)接口:Command.javaCommand.javapublic interface Command public interface Command public abstract void execute();public abstract void execute();203 3具体命令(具体命令(ConcreteCommandConcreteCommand)ConcreteCommand.java ConcreteCommand.java public class ConcreteCommand implements Commandpublic class ConcreteC
29、ommand implements Command CompanyArmy army;CompanyArmy army;/含有接收者的引用含有接收者的引用 ConcreteCommand(CompanyArmy army)ConcreteCommand(CompanyArmy army)this.army=army;this.army=army;public void execute()public void execute()/封装着指挥官的请求封装着指挥官的请求 army.sneakAttack();army.sneakAttack();/偷袭敌人偷袭敌人 214 4请求者(请求者(Inv
30、okerInvoker)ArmySuperior.java ArmySuperior.java public class ArmySuperiorpublic class ArmySuperior Command command;Command command;/用来存放具体命令的引用用来存放具体命令的引用 public void setCommand(Command command)public void setCommand(Command command)mand=command;mand=command;public void startExecuteCommand()public v
31、oid startExecuteCommand()/让具体命令执行让具体命令执行execute()execute()方法方法 command.execute();command.execute();225 5应用应用 Application.javaApplication.java public class Application public class Application public static void main(String args)public static void main(String args)CompanyArmy CompanyArmy 三连三连=new Com
32、panyArmy();=new CompanyArmy();Command command=new ConcreteCommand(Command command=new ConcreteCommand(三连三连););ArmySuperior ArmySuperior 指挥官指挥官=new ArmySuperior();=new ArmySuperior();指挥官指挥官.setCommand(command);.setCommand(command);指挥官指挥官.startExecuteCommand();.startExecuteCommand();命令模式的优点命令模式的优点 201
33、1-11-2923 在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含接收者(Receiver)的引用,因此彻底消除了彼此之间的耦合。命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接受者,不必修改调用者的代码,调用者就可以使用新的命令对象;反之,如果增加新的调用者,不必修改现有的具体命令和接受者,新增加的调用者就可以使用已有的具体命令。由于请求者的请求被封装到了具体命令中,那么就可以将具体命令保存到持久化的媒介中,在需要的时候,重新执行这个具体命令。因此,使用命令模式可以记录日志。使用命令模式可以对请求者的“请求”进行排队
34、。每个请求都各自对应一个具体命令,因此可以按一定顺序执行这些具体命令。效果及实现要点1Command模式的根本目的在于将“行为请求者”与“行为实现者”解耦,在面向对象语言中,常见的实现手段是“将行为抽象为对象”。2实现Command接口的具体命令对象ConcreteCommand有时候根据需要可能会保存一些额外的状态信息。3通过使用Compmosite模式,可以将多个命令封装为一个“复合命令”MacroCommand。4Command模式与C#中的Delegate有些类似。但两者定义行为接口的规范有所区别:Command以面向对象中的“接口-实现”来定义行为接口规范,更严格,更符合抽象原则;D
35、elegate以函数签名来定义行为接口规范,更灵活,但抽象能力比较弱。5使用命令模式会导致某些系统有过多的具体命令类。某些系统可能需要几十个,几百个甚至几千个具体命令类,这会使命令模式在这样的系统里变得不实际。适用性适用性1.抽象出待执行的动作以参数化某对象。2.在不同的时刻指定、排列和执行请求。3.支持取消操作。4.支持修改日志,这样当系统崩溃时,这修改可以被重做一遍。5.用构建在原语操作上的高层操作构造一个系统解释器模式解释器模式 2011-11-2926解释器模式解释器模式 给定一个语言,定义它的文法的一种表示,并定义一给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使
36、用该表示来解释语言中的句子个解释器,这个解释器使用该表示来解释语言中的句子。Interpreter Pattern Interpreter Pattern Interpreter Pattern Interpreter Pattern Given a language,define a representation for its Given a language,define a representation for its Given a language,define a representation for its Given a language,define a represent
37、ation for its grammar along with an interpretergrammar along with an interpretergrammar along with an interpretergrammar along with an interpreterthat uses the representation to interpret sentences that uses the representation to interpret sentences that uses the representation to interpret sentence
38、s that uses the representation to interpret sentences in the language.in the language.in the language.in the language.概概 述述 2011-11-2927 解释模式是关于怎样实现一个简单语言的解释模式是关于怎样实现一个简单语言的成熟模式,其关键是将每一个语法规则表示成成熟模式,其关键是将每一个语法规则表示成一个类。一个类。解释器解释器模式的结构与使用模式的结构与使用 2011-11-2928模式的结构中包括四种角色:模式的结构中包括四种角色:抽象表达式(抽象表达式(Abstra
39、ctExpressionAbstractExpression)终结符表达式子(终结符表达式子(TerminalExpressionTerminalExpression)非终结符表达式子非终结符表达式子(NonterminalExpressionNonterminalExpression)上下文(上下文(ContextContext)2011-11-2929模式的模式的UMLUML类图类图 参与者1.AbstractExpression(抽象表达式)声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。2.TerminalExpression(终结符表达式)实现与文法中的终结符相关联的
40、解释操作。一个句子中的每个终结符需要该类的一个实例。3.NonterminalExpression(非终结符表达式)为文法中的非终结符实现解释(Interpret)操作。4.Context(上下文)包含解释器之外的一些全局信息。2011-11-2931模式的结构的描述与使用模式的结构的描述与使用 1 1抽象表达式(抽象表达式(AbstractExpressionAbstractExpression):Node.java Node.java public interface Nodepublic interface Node public void parse(Context text);pub
41、lic void parse(Context text);public void execute();public void execute();32模式的结构的描述与使用模式的结构的描述与使用 2 2终结符表达式(终结符表达式(TerminalExpressionTerminalExpression)_1:_1:SubjectPronounOrNounNode.java SubjectPronounOrNounNode.java public class SubjectPronounOrNounNode implements Nodepublic class SubjectPronounOr
42、NounNode implements Node String word=You,He,Teacher,Student;String word=You,He,Teacher,Student;String token;String token;boolean boo;boolean boo;public void parse(Context context)public void parse(Context context)token=context.nextToken();token=context.nextToken();int i=0;int i=0;for(i=0;iword.lengt
43、h;i+)for(i=0;iword.length;i+)if(token.equalsIgnoreCase(wordi)if(token.equalsIgnoreCase(wordi)boo=true;boo=true;break;break;if(i=word.length)if(i=word.length)boo=false;boo=false;public void execute()public void execute()if(boo)if(boo)if(token.equalsIgnoreCase(word0)if(token.equalsIgnoreCase(word0)Sys
44、tem.out.print();System.out.print();if(token.equalsIgnoreCase(word1)if(token.equalsIgnoreCase(word1)System.out.print(System.out.print(他他););if(token.equalsIgnoreCase(word2)if(token.equalsIgnoreCase(word2)System.out.print(System.out.print(老师老师););if(token.equalsIgnoreCase(word3)if(token.equalsIgnoreCa
45、se(word3)System.out.print(System.out.print(学生学生););else else System.out.print(token+(System.out.print(token+(不是该语言中的语句不是该语言中的语句););2011-11-2933模式的结构的描述与使用模式的结构的描述与使用 2 2终结符表达式(终结符表达式(TerminalExpressionTerminalExpression)_2:_2:ObjectPronounOrNounNode.java ObjectPronounOrNounNode.java public class Obj
46、ectPronounOrNounNode implements Nodepublic class ObjectPronounOrNounNode implements Node String word=Me,Him,Tiger,Apple;String word=Me,Him,Tiger,Apple;String token;String token;boolean boo;boolean boo;public void parse(Context context)public void parse(Context context)token=context.nextToken();token
47、=context.nextToken();int i=0;int i=0;for(i=0;iword.length;i+)for(i=0;iword.length;i+)if(token.equalsIgnoreCase(wordi)if(token.equalsIgnoreCase(wordi)boo=true;boo=true;break;break;if(i=word.length)if(i=word.length)boo=false;boo=false;public void execute()public void execute()if(boo)if(boo)if(token.eq
48、ualsIgnoreCase(word0)if(token.equalsIgnoreCase(word0)System.out.print(System.out.print(我我););if(token.equalsIgnoreCase(word1)if(token.equalsIgnoreCase(word1)System.out.print(System.out.print(他他););if(token.equalsIgnoreCase(word2)if(token.equalsIgnoreCase(word2)System.out.print(System.out.print(老虎老虎)
49、;);if(token.equalsIgnoreCase(word3)if(token.equalsIgnoreCase(word3)System.out.print(System.out.print(苹果苹果););else else System.out.print(token+(System.out.print(token+(不是该语言中的语句不是该语言中的语句););2011-11-2934模式的结构的描述与使用模式的结构的描述与使用 2 2终结符表达式(终结符表达式(TerminalExpressionTerminalExpression)_3:_3:VerbNode.java Ve
50、rbNode.java public class VerbNode implements Nodepublic class VerbNode implements Node String word=Drink,Eat,Look,beat;String word=Drink,Eat,Look,beat;String token;String token;boolean boo;boolean boo;public void parse(Context context)public void parse(Context context)token=context.nextToken();token