欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

命令模式(Command Pattern)_Java

程序员文章站 2022-05-03 23:28:09
...

Command Pattern


命令模式(Command Pattern)_Java
            
    
    博客分类: 设计模式 命令模式Command Pattern设计模式 
 

餐厅中的命令模式:
客人给服务员下菜单,服务员记录下来,给厨师,让厨师做出美丽的菜肴!
这其中,客户是跟厨师见不着的,对于程序来说即降低了耦合度。

我们再以遥控器为例,说一下命令模式

小红按下了手中的遥控器的开按钮,遥控器给电视发送开的命令,电视接收到命令后执行开的动作,电视被打开。小红看完了电视,按下关的按钮,同样,遥控器控制电视关的操作,这期间,小红是不用接触到电视机的。

下面用程序实现此命令模式

package com.pattern.command;
/**
 * 遥控器
 */
public class Remoter {
	/**
	 * 遥控器按钮按下,要执行一个命令
	 */
	public void buttonPress(Command cmd){
		cmd.execute();
	}
}

 

package com.pattern.command;
/**
 * 命令接口,每一个命令都有一个execute方法
 */
public interface Command {
	public void execute();
}

 

package com.pattern.command;
/**
 * 打开电视命令,实现了命令接口,提供有执行命令的方法
 */
public class OpenTvCommand implements Command {
	//命令作用的对象
	private Tv tv;
	//执行电视打开之前,需要有一个电视
	public OpenTvCommand(Tv tv){
		this.tv=tv;
	}
	//让电视执行打开方法
	@Override
	public void execute() {
		tv.open();
	}

}

 

package com.pattern.command;
/**
 * 电视,具有打开和关闭的方法
 * 遥控器调用不同的命令来操作电视具有的方法
 */
public class Tv {

	public void open(){
		System.out.println("TV open...");
	}
	public void close(){
		System.out.println("TV close...");
	}
}

 

package com.pattern.command;
/**
 * 关闭电视命令
 */
public class CloseTvCommand implements Command {

	private Tv tv;

	public CloseTvCommand(Tv tv){
		this.tv=tv;
	}
	
	@Override
	public void execute() {
		tv.close();
	}

}

 

package com.pattern.command;

public class Test {
	public static void main(String[] args) {
		Tv tv=new Tv();//买了一个电视
		Remoter remoter=new Remoter();//电视配有一个遥控器
		OpenTvCommand openCommand=new OpenTvCommand(tv);//给这个电视配置了打开命令
		//遥控器按下打开命令,电视被打开
		remoter.buttonPress(openCommand);//TV open...
		CloseTvCommand closeCommand=new CloseTvCommand(tv);
		remoter.buttonPress(closeCommand);//TV close...
		
	}
}

 

今天我买了一个超级遥控器,把所有的命令装进去,我只需要按相应的按钮就可以了
SuperRemoter

 

package com.pattern.command1;

import java.util.ArrayList;
import java.util.List;

public class SuperRemoter {

	private List<Command> cmds=new ArrayList<Command>();
	public void add(Command... args){
		for (Command command : args) {
			cmds.add(command);
		}
	}
	
	public void buttonPress(int index){
		cmds.get(index-1).execute();
	}
}

 

package com.pattern.command1;

public class Test {
	public static void main(String[] args) {
		Tv tv=new Tv();//买了一个电视
		Remoter remoter=new Remoter();//电视配有一个遥控器
		OpenTvCommand openCommand=new OpenTvCommand(tv);//给这个电视配置了打开命令
		//遥控器按下打开命令,电视被打开
		remoter.buttonPress(openCommand);//TV open...
		CloseTvCommand closeCommand=new CloseTvCommand(tv);
		remoter.buttonPress(closeCommand);//TV close...
		
		//***************今天我买了一个超级遥控器
		SuperRemoter sr=new SuperRemoter();
		sr.add(openCommand,closeCommand);//把电视的所有命令都装进去了,按下第几个键就可以了
		sr.buttonPress(1);//执行第一个命令
		sr.buttonPress(2);//执行第二个命令
		
		
	}
}

 

过几天,我又有新想法了,能不能让我的超级遥控器,按下某一个按钮,同时帮我打开电视和电灯呢!!
这里要使用宏命令了,什么是宏命令呢?就是一个操作可以完成多个命令!

package com.pattern.command1;

public class Light {
	public void open(){
		System.out.println("Light open...");
	}
	public void close(){
		System.out.println("Light close...");
	}
}

 

package com.pattern.command1;
/**
 * 打开电灯命令,实现了命令接口,提供有执行命令的方法
 */
public class OpenLightCommand implements Command {
	//命令作用的对象
	private Light light;
	//执行电灯打开之前,需要有一个电灯
	public OpenLightCommand(Light light){
		this.light=light;
	}
	//让电灯执行打开方法
	@Override
	public void execute() {
		light.open();
	}

}

 

package com.pattern.command1;

public class MarcoCommand implements Command{

	private Command[] cmds;
	
	public MarcoCommand(Command... cmds){
		this.cmds=cmds;
	}
	
	@Override
	public void execute() {
		for (Command command : cmds) {
			command.execute();
		}
	}

}

 

package com.pattern.command1;

public class Test {
	public static void main(String[] args) {
		Tv tv=new Tv();//买了一个电视
		Remoter remoter=new Remoter();//电视配有一个遥控器
		OpenTvCommand openCommand=new OpenTvCommand(tv);//给这个电视配置了打开命令
		//遥控器按下打开命令,电视被打开
		remoter.buttonPress(openCommand);//TV open...
		CloseTvCommand closeCommand=new CloseTvCommand(tv);
		remoter.buttonPress(closeCommand);//TV close...
		
		//***************今天我买了一个超级遥控器
		SuperRemoter sr=new SuperRemoter();
		sr.add(openCommand,closeCommand);//把电视的所有命令都装进去了,按下第几个键就可以了
		sr.buttonPress(1);//执行第一个命令
		sr.buttonPress(2);//执行第二个命令
		
		//******************我一到家,我就按下一个按钮,就打开我的电视和电灯了!!!
		Light light=new Light();
		OpenLightCommand openLightCommand=new OpenLightCommand(light);
		MarcoCommand mc=new MarcoCommand(openCommand,openLightCommand);
		sr.add(mc);
		sr.buttonPress(3);//TV open...   Light open...
		
		
	}
}

 

 

  • 命令模式(Command Pattern)_Java
            
    
    博客分类: 设计模式 命令模式Command Pattern设计模式 
  • 大小: 255.6 KB