命令设计模式-设计模式

1.代码实例:

package tv;

//执行命令的接口
public interface Command {

	void execute();
	
}
package tv;
//开机命令ConcreteCommand
public class CommandOn implements Command {

	private Tv tv;
	
	public CommandOn(Tv tv) {
		this.tv = tv;
	}
	
	@Override
	public void execute() {
		tv.turnOn();
	}
}
package tv;
//切换频道命令ConcreteCommand
public class CommandChanges implements Command {

	private Tv tv;
	private int channel;
	
	public CommandChanges(Tv tv, int channel) {
		this.tv = tv;
		this.channel = channel;
	}
	
	@Override
	public void execute() {
		tv.changeChannel(channel);
	}
}
package tv;
//关机命令ConcreteCommand
public class CommandOff implements Command {

	private Tv tv;
	
	public CommandOff(Tv tv) {
		this.tv = tv;
	}
	
	@Override
	public void execute() {
		tv.turnOff();
	}
}
package tv;
//遥控器 Invoker
public class Control {

	private Command onCommand, offCommand, changeChannel;
	
	public Control(Command on,Command off, Command change) {
		onCommand = on;
		offCommand = off;
		changeChannel = change;
	}
	
	public void turnOn() {
		onCommand.execute();
	}
	
	public void turnOff() {
		offCommand.execute();
	}
	
	public void changeChannel() {
		changeChannel.execute();
	}
	
}

package tv;

//测试类 Client
public class Client {

	public static void main(String[] args) {
		//命令接收者Receiver
		Tv tv = new Tv();
		//开机命令ConcreteCommand
		Command onCommand = new CommandOn(tv);
		//关机命令ConcreteCommand
		Command offCommand = new CommandOff(tv);
		//切换命令ConcreteCommand
		Command changeCommand = new CommandChanges(tv, 5);
		//命令控制Invoker
		Control control = new Control(onCommand, offCommand, changeCommand);
		
		//开机
		control.turnOn();
		//切换
		control.changeChannel();
		//关机
		control.turnOff();
	}
}


2.概念

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

3.命令模式设计到哪些角色

      (1)命令角色Command:声明执行操作的接口

      (2)具体命令角色ConcreteCommand:将一个接收者对象绑定于一个动作,调用接收者相应的操作,用以实现命令角色声明的执行操作的接口

      (3)客户角色Client: 创建一个具体命令对象

      (4)请求者角色Invoker:调用命令对象执行这个请求

      (5)接收者角色Receiver:

4. 优缺点
    (1) 将调用操作的请求对象与知道如何实现该操作的接收者对象解耦
    (2)具体命令角色可以被不同的请求者角色重用
    (3) 可以将多个命令装配成一个复合命令
    (4) 便于增加新的具体命令角色

5.例子

//命令角色Command
public interface Command {

	void execute();
}
//具体命令角色ConcreteCommand
public class ConcreteCommandOne implements Command {

	private Receiver receiver;
	
	public ConcreteCommandOne(Receiver receiver) {
		this.receiver = receiver;
	}
	
	@Override
	public void execute() {
		this.receiver.actionOne();
	}
}
//具体命令角色ConcreteCommand
public class ConcreteCommandTwo implements Command {

    private Receiver receiver;
	
	public ConcreteCommandTwo(Receiver receiver) {
		this.receiver = receiver;
	}
	
	@Override
	public void execute() {
		this.receiver.actionTwo();
	}
}
//接收者角色Receiver
public class Receiver {

	public Receiver() {
		
	}
	
	public void actionOne() {
		System.out.println("ActionOne has been taken");
	}
	
	public void actionTwo() {
		System.out.println("ActionTwo has been taken");
	}
}
//请求者角色
public class Invoker {

	private Command ConcreteCommandOne;
	private Command ConcreteCommandTwo;
	
	public Invoker(Command ConcreteCommandOne, Command ConcreteCommandTwo) {
		this.ConcreteCommandOne = ConcreteCommandOne;
		this.ConcreteCommandTwo = ConcreteCommandTwo;
	}
	
	public void actionOne() {
		this.ConcreteCommandOne.execute();
	}
	
	public void actionTwo() {
		this.ConcreteCommandTwo.execute();
	}
}
//客户角色
public class Client {

	public static void main(String[] args) {
		
		Receiver receiver = new Receiver();
		Command commandOne = new ConcreteCommandOne(receiver);
		Command commandTwo = new ConcreteCommandTwo(receiver);
		Invoker invoker = new Invoker(commandOne, commandTwo);
		invoker.actionOne();
		invoker.actionTwo();
	}
}
6命令模式与其他模式配合使用
 (1) 代理模式
 (2) 有个固定命令组合会被多次执行 组合模式
 (3) 需要redo undo 备忘录模式
 (4) 命令很多类似地方 原型模式 clone






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值