声明
本人写此文章只是为了梳理知识、更好的学习,基本内容来源于课本《软件架构与模式》,若有错误还请指正,此外会借鉴一些优秀的文章,网址放在文末,若有侵权可告知我删除。
一、行为模式
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();
}
}
运行结果
开灯
关灯
优点
命令的生成和执行在时间上没有关联。
通过把命令封装在一个命令对象中,引入一个中间层。所以命令和执行可以异步进行。
调用者不需要知道具体命令细节。所以命令可以更换,调用者的实现可以不依赖于系统的其他部分。
可以在运行时动态的更换命令,可以改变调用者的行为。
命令对象可以复用,所以对于一个命令对象指向接受者对象的引用是可以改变的。命令对象可以重新执行,客户不必为每一个接受者都生成一个新的命令对象。
缺点
把命令封装在一个对象中,在调用命令时生成了额外的开销(装箱)。
每一个具体命令都要有一个类相对应。如果要增加命令的参数或者为一个命令编写另外一个接受者类,就会增加系统开销。
此模式用于分布式系统时相当复杂。
类似的模式
策略模式。
活动对象模式是命令模式的扩展。