本人写此文章只是为了梳理知识、更好的学习,基本内容来源于课本《软件架构与模式》,若有错误还请指正,此外会借鉴一些优秀的文章,网址放在文末,若有侵权可告知我删除。
1、行为模式描述了通过对象间的合作形成的一种关系。 2、行为模式可以区分为基于类的行为模式和基于对象的行为模式。基于类的行为模式通过继承得到所希望的静态行为(如模板方法模式)。基于对象的行为模式可以使用里氏代换原则,在运行时通过提替换对象修改行为(动态修改行为的例子是策略模式)。 3、行为模式研究的是类或对象之间的合作与任务分工,它描述的是对象间的交互。
命令模式把命令作为对象进行封装,这样可以让一个命令的生成和执行分离。命令可以先生成,然后在以后的某一时刻在执行。所有命令如果放入一个列表中,就可以轻松的实现日志功能或者撤销功能。 调用者不应该依赖于命令的具体表现形式,它应该只识别一个命令的抽象形式,具体命令的细节对于调用者是隐藏的,调用者不应识别命令的接受者。
灯的开关是调用者,用于施发命令(开关灯的命令),每个命令是一个类,命令类中定义灯的实例,调用灯的方法。开关类调用命令类,命令类调用灯类,这样开关类就与灯类没有实际联系。
命令接口:
interface ICommand { public void execute(); }灯:具体命令的接受类。
public class Light { public void open() { System.out.println("开灯"); } public void close() { System.out.println("关灯"); } }开灯命令:
public class LightOpen implements ICommand { private Light light; public LightOpen(Light light) { this.light = light; } public void execute() { light.open(); } }关灯命令:
public class LightClose implements ICommand { private Light light; public LightClose(Light light) { this.light = light; } public void execute() { light.close(); } }灯的开关:调用者类。【注意代码,注意private】
public class LightSwitch { private ICommand icom; public void command(ICommand icom) { this.icom = icom; } public void update() { icom.execute(); } }测试主类:
public class CommandTest { public static void main(String[] args) { LightSwitch LS = new LightSwitch(); Light light = new Light(); ICommand open = new LightOpen(light); ICommand close = new LightClose(light); LS.command(open); LS.update(); LS.command(close); LS.update(); } }开灯 关灯
命令的生成和执行在时间上没有关联。 通过把命令封装在一个命令对象中,引入一个中间层。所以命令和执行可以异步进行。 调用者不需要知道具体命令细节。所以命令可以更换,调用者的实现可以不依赖于系统的其他部分。 可以在运行时动态的更换命令,可以改变调用者的行为。 命令对象可以复用,所以对于一个命令对象指向接受者对象的引用是可以改变的。命令对象可以重新执行,客户不必为每一个接受者都生成一个新的命令对象。
把命令封装在一个对象中,在调用命令时生成了额外的开销(装箱)。 每一个具体命令都要有一个类相对应。如果要增加命令的参数或者为一个命令编写另外一个接受者类,就会增加系统开销。 此模式用于分布式系统时相当复杂。
策略模式。 活动对象模式是命令模式的扩展。