耦合太多的其它类的实例的引用,太多的其它类的实例的引用,以避免修改
系统的其中一部分会影响到其它部分。系统的其中一部分会影响到其它部分。
2011-12-1711
第四章
命令模式
命令模式(别名:动作,事务)命令模式(别名:动作,事务)将一个请求封装为一个对象,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。及支持可撤消的操作。CommandPattern(AnotherName:Action,Transaction)Encapsulatearequestasanobject,therebylettingyouparameterizeclientswithdifferentrequests,queueorlogrequests,andsupportundoableoperations.
2011-12-1712
一、概述
在许多设计中,经常涉及到一个对象请求另一个对在许多设计中,象调用其方法到达某种目的。象调用其方法到达某种目的。如果请求者不希望或无法直接和被请求者打交道,法直接和被请求者打交道,即不希望或无法含有被请求者的引用,那么就可以使用命令模式。求者的引用,那么就可以使用命令模式。
2011-12-1713
实例
在军队作战中,指挥官请求三连偷袭敌人,但是指挥官不希望或无法直接与三连取得联系,那么可以将该请求:“三连偷袭敌人”形成一个“作战命令”。只要能让该作战命令被执行,就会实现三连偷袭敌人的目的。
二、命令模式的结构与使用
模式的结构中包括四种角色:模式的结构中包括四种角色:????
2011-12-1715
接收者(Receiver)接收者(Receiver)命令(Command)接口命令(Command)接口(Command)具体命令(ConcreteCommand)具体命令(ConcreteCommand)请求者(Invoker)请求者(Invoker)
模式的UML类图模式的UML类图UML
2011-12-1716
模式的结构的描述与使用
1.接收者(Receiver):CompanyArmy.java接收者(Receiver)publicclassCompanyArmy{publicvoidsneakAttack(){System.out.我们知道如何偷袭敌人,");System.out.println("我们知道如何偷袭敌人,保证完成任务");}}
2011-12-1717
模式的结构的描述与使用
2.命令(Command)接口:Command.java命令(Command)publicinterfaceCommand{execute();publicabstractvoidexecute();}
2011-12-1718
模式的结构的描述与使用3.具体命令(ConcreteCommand)ConcreteCommand.java具体命令(ConcreteCommand)publicclassConcreteCommandimplementsCommand{//含有接收者的引用CompanyArmyarmy;//含有接收者的引用ConcreteCommand(CompanyArmyarmy){this.army=army;}//封装着指挥官的请求publicvoidexecute(){//封装着指挥官的请求//偷袭敌人army.sneakAttack();//偷袭敌人}}
2011-12-1719
模式的结构的描述与使用4.请求者(Invoker)ArmySuperior.java请求者(Invoker)publicclassArmySuperior{command;//用来存放具体命令的引用Commandcommand;//用来存放具体命令的引用publicvoidsetCommand(Commandcommand){this.command=command;this.command=command;}publicvoidstartExecuteCommand(){
//让具体命令执行execute()方法//让具体命令执行execute()方法让具体命令执行execute()
command.execute();command.execute();}}
2011-12-1720
模式的结构的描述与使用5.应用Application.javapublicclassApplication{publicstaticvoidmain(Stringargs[]){三连=newCompanyArmy();CompanyArmy三连=newCompanyArmy();Commandcommand=newConcreteCommand(三连);ArmySuperior指挥官=newArmySuperior();指挥官=newArmySuperior();指挥官.setCommand(command);指挥官.setCommand(command);指挥官.startExecuteCommand();指挥官.startExecuteCommand();}}
2011-12-1721
三、命令模式的优点??
在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含接收者(Receiver)的引用,因此彻底消除了彼此之间的耦合。
命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接