设计模式之行为模式中的命令模式(command)

声明

本人写此文章只是为了梳理知识、更好的学习,基本内容来源于课本《软件架构与模式》,若有错误还请指正,此外会借鉴一些优秀的文章,网址放在文末,若有侵权可告知我删除。

一、行为模式

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();
	}
}

运行结果

开灯
关灯

优点

命令的生成和执行在时间上没有关联。
通过把命令封装在一个命令对象中,引入一个中间层。所以命令和执行可以异步进行。
调用者不需要知道具体命令细节。所以命令可以更换,调用者的实现可以不依赖于系统的其他部分。
可以在运行时动态的更换命令,可以改变调用者的行为。
命令对象可以复用,所以对于一个命令对象指向接受者对象的引用是可以改变的。命令对象可以重新执行,客户不必为每一个接受者都生成一个新的命令对象。

缺点

把命令封装在一个对象中,在调用命令时生成了额外的开销(装箱)。
每一个具体命令都要有一个类相对应。如果要增加命令的参数或者为一个命令编写另外一个接受者类,就会增加系统开销。
此模式用于分布式系统时相当复杂。

类似的模式

策略模式。
活动对象模式是命令模式的扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值