命令模式
命令模式:
通俗的讲,例如点菜:你命令 服务员 去上菜单上的 青椒肉丝,而青椒肉丝的制作者是大厨。
这里有5个角色:
- 菜单: 命令角色接口
- 青椒肉丝: 具体命令角色
- 大厨: 接收者角色
- 服务员: 请求者角色
- 你: 客户端
例如:
命令角色 | Runnable |
具体命令角色 | Runnable的实现,实现具体业务,里面维护一个接受者,去执行具体业务 |
接受者 | 也就是 具体业务的执行者,或者说,具体命令------大厨炒辣椒,这里大叔就是接受者 |
请求者角色 | 编写一个类,去调用具体命令的 start()方法(服务员的任务)。(这里可以结合组合模式,代理模式,备忘录模式(事务)等等) |
客户端 | 1. 实例化接受者对象, 2. 实例化命令角色,并传入执行者(接受者) 3. 实例化请求者统一管理所有命令角色, 4. 最后:调用其执行方法。 |
距离例子:
/**
1. 命令模式
2. 1.抽象命令角色Commond
3. 2.具体命令角色CommondOn、CommondOff、CommondChange
4. 3.请求者角色CommondManager
5. 4.接受者角色TV
6. 5.客户端Client
*/
package Abstract.commond;
class CommondManager
{
private Commond commondOn;
private Commond commondOff;
private Commond commondChange;
public CommondManager( Commond on , Commond off ,Commond change )
{
this.commondChange = change;
this.commondOn = on;
this.commondOff = off;
}
public void turnOn()
{
commondOn.execute();
}
public void turnOff()
{
commondOff.execute();
}
public void change()
{
commondChange.execute();
}
}
interface Commond
{
void execute();
}
class CommondOn implements Commond
{
private TV myTv;
public CommondOn(TV tv )
{
this.myTv = tv;
}
public void execute() {
myTv.turnOn();
}
}
class CommondOff implements Commond
{
private TV myTv;
public CommondOff( TV tv)
{
this.myTv = tv;
}
public void execute()
{
myTv.turnOff();
}
}
class CommondChange implements Commond
{
private TV myTv;
private int channel;
public CommondChange( TV tv ,int currentChannel )
{
this.myTv = tv;
this.channel = currentChannel;
}
public void execute()
{
myTv.change(channel);
}
}
class TV
{
public int currentChannel = 0;
public TV ()
{
}
public void turnOn()
{
System.out.println("打开电视");
}
public void turnOff()
{
System.out.println("关机");
}
public void change(int channel){
this.currentChannel = channel;
System.out.println(" Now TV channel is : "+currentChannel);
}
}
public class Client {
public static void main(String[] args) {
//创建 接受者 -------- 包含具体的执行处理逻辑
TV tv = new TV();
// 创建具体命令对象,并 指定其 接受者
Commond on = new CommondOn(tv);
Commond off = new CommondOff(tv);
Commond change = new CommondChange(tv,2);
// 请求者 负责调用 命令对象Commond 执行这个请求
CommondManager commondManager = new CommondManager(on, off, change);
commondManager.turnOn();
commondManager.change();
commondManager.turnOff();
}
}
命令模式的优点:
1.命令模式将调用操作的请求对象(commondManager ) 与 知道该如何操作的接收者对象(TV) 解耦
2.具体命令角色(CommondOff)可以被不同的请求者对象(TV)重用
3.你可以将多个命令装配成一个复合命令(组合模式)
4.增加新的具体命令角色很容易,因为这无需改变已有的类。