# 23种设计模式-命令模式

# 1.命令模式

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

# 优缺点

# 优点:

降低耦合 扩展性高

# 缺点:

增加复杂

# 使用场景

# 实现方式

# 抽象命令类:Command.java

/**
 * Command命令接口,为所有的命令声明一个接口。所有的命令都应该实现它
 */
public interface Command {
	public void execute();
}

# 电视机类:Television.java

public class Television {
	public void open(){
		System.out.println("打开电视机......");
	}
	
	public void close(){
		System.out.println("关闭电视机......");		
	}
	
	public void changeChannel(){
		
		System.out.println("切换电视频道......");
	}
}

# 遥控器类:Controller.java

public class Controller {
	private Command openTVCommand;
	private Command closeTVCommand;
	private Command changeChannelCommand;
	
	public Controller(Command openTvCommand,Command closeTvCommand,Command changeChannelCommand){
		this.openTVCommand = openTvCommand;
		this.closeTVCommand = closeTvCommand;
		this.changeChannelCommand = changeChannelCommand;
	}
	
	/**
	 * 打开电视剧
	 */
	public void open(){
		openTVCommand.execute();
	}
	
	/**
	 * 关闭电视机
	 */
	public void close(){
		closeTVCommand.execute();
	}
	
	/**
	 * 换频道
	 */
	public void change(){
		changeChannelCommand.execute();
	}
}

# 遥控器的三个按钮:

public class OpenTvCommand implements Command{
	private Television tv;
	
	public OpenTvCommand(Television tv){
		this.tv = tv;
	}
	
	public void execute() {
		tv.open();
	}
}

public class ChangeChannelCommand implements Command{
	private Television tv;
	
	public ChangeChannelCommand(Television tv){
		this.tv = tv;
	}
	
	public void execute() {
		tv.changeChannel();
	}
}

public class CloseTvCommand implements Command{
	private Television tv;
	
	public CloseTvCommand(Television tv){
		this.tv = tv;
	}
	
	public void execute() {
		tv.close();
	}
}

# 测试类

public class Client {
		public static void main(String a[])
		{
			Television tv = new Television();
                        Command openCommand,closeCommand,changeCommand;
			
			openCommand = new OpenTvCommand(tv);
			closeCommand = new CloseTvCommand(tv);
			changeCommand = new ChangeChannelCommand(tv);
			
			Controller control = new Controller(openCommand,closeCommand,changeCommand);
			
			control.open();           //打开电视机
			control.change();         //换频道
			control.close();          //关闭电视机
		}
}

参考博客:https://blog.csdn.net/a745233700/article/details/83713445