命令模式第一篇
一:命令模式的定义:
将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
二:命令模式所含有得成员:
(1)command(命令接口),它是所有命令的接口,声明执行命令的方法(面向接口编程,而非面向具体)
(2)concretecommand(具体命令),命令的请求者(将请求封装成了对象——concretcommand),通常含有一个命令的接收者的对象引用,将”接收者”的方法接口封装在”执行命令的方法”中(只知道调用了“接收者”类的哪些方法,并不知道这些方法怎么实现的)
(3)receiver(命令的接收者):具体执行命令的对象,任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
(4)Invoker(命令的提交者):要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并执行相应操作的地方,也就是说相当于使用命令对象的入口。
(5)client:创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。
三:命令模式的特点:
(1)命令模式的最大特点是:将行为的请求者与行为的实现者解耦(方法就是:将“请求”封装成对象)
(2)命令模式将行为的请求者和行为的实现者解耦后,行为的请求者只关注“将哪些请求传给行为的实现者,并且做出了响应”而不关注“行为的实现者如何具体处理这些请求”
(3)通常命令提交者含有一个命令接口的对象引用。”命令的接收者”类中含有一个“命令请求者”类的对象引用。
以下是命令模式的一个代码示例:
public interface command { //命令类
public void excute(); //含有一个提交订单的方法(通过该方法调用厨师类的一些方法,完成餐品制作操作)
}
public class Light { //接受者类,真正的动作执行者
String name;
public Light(String name)
{
this.name=name; //初始化灯的名字
}
public void lighton()
{
System.out.println("打开"+name+"的灯!!!");
}
public void lightoff()
{
System.out.println("关闭"+name+"的灯!!!");
}
}
public class lightoncommand implements command //命令的请求者(体现了命令模式的特点:将请求封装成了对象)
//利用command接口,每个动作都被实现成了一个命令对象
{
Light light; //含有一个接受者类的对象引用
public lightoncommand(Light light)
{
this.light=light; //初始化“命令的接受者”类的对象
}
public void excute()
{
light.lighton(); //向命令的接受者发出请求,使命令的执行者具体执行某些操作
}
}
public class controler { //命令的提交者(命令的接受者和命令的请求者之间的桥梁)
command comm; //含有一个命令接口的对象引用,用于传递“请求”(实现了动作的请求者和动作的执行者解耦的目的)
//这个例子中,动作的请求者为lightoncommand,动作的执行者为light
public void setcommand(command comm)
{
this.comm=comm;
//该方法用于设置命令(传递进来的参数肯定是实现某个command接口的类,所以势必用到接口回调)
}
public void submmitcommand()
{
comm.excute();
//调用该方法将“命令”提交给receiver(真正的动作执行者),中间桥梁是excute(“请求”),“请求”方法内封装receiver的方法接口
}
}
public class client {
public static void main(String[] args) {
Light light=new Light("卧室"); //先实例化一个“请求的接收者”类的对象
lightoncommand lighton=new lightoncommand(light); //实例化一个命令(传递进来一个“接受者”类的对象引用)
controler control=new controler(); //实例化一个“命令的提交者”类的对象
control.setcommand(lighton); //然后调用setcommand方法设置命令
control.submmitcommand(); //然后将命令提交给“命令的接受者”,命令其完成某一些操作
}
}