设计模式-命令模式

命令模式

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

模式结构

command:定义命令的接口,声明执行的方法。

concretecommand:命令接口实现对象,是“虚”的实现,永昌汇持有接收者,并调用接受者的功能来完成要执行的操作。

receiver:接受者,真正执行命令的对象,任何类都有可能成为一个接收者,只要它能够实现命令要求实现的相应的功能。

invoker:要求命令对象执行的请求,通常会持有命令对象,可以持有很多的额命令对象,这个是客户端真正触发命令要求命令执行相应操作的地方,就是使用命令对象的入口。

client:创建具体的命令对象,并且设置命令对象的接收者。

结构UML图

代码示例

 command:

package com.tian.command;

/**
 * 定义一个命令类来声明执行操作的抽象类
 * @author Administrator
 *
 */
public abstract class Command {

	protected TVReceiver receiver;
	
	public Command(TVReceiver receiver) {
		this.receiver = receiver;
	}
	
	public abstract void execute();
	
}

ConcreteCommand:

打开电视命令

package com.tian.command;

/**
 * 打开电视机命令
 * @author Administrator
 *
 */
public class ConcreteCommandOnOpen extends Command {

	public ConcreteCommandOnOpen(TVReceiver receiver) {
		super(receiver);
	}

	@Override
	public void execute() {
		receiver.onOpen();
	}

}

 关闭电视命令

package com.tian.command;

/**
 * 关闭电视命令
 * @author Administrator
 *
 */
public class ConcreteCommandOnOff extends Command {

	public ConcreteCommandOnOff(TVReceiver receiver) {
		super(receiver);
	}

	@Override
	public void execute() {
		
		receiver.onOff();
	}

}

Receiver:

package com.tian.command;

/**
 * 电视命令接收者(相当于遥控器)
 * @author Administrator
 *
 */
public class TVReceiver {

	public void onOpen() {
		System.out.println("打开电视机。。。。。");
	}
	
	public void onOff() {
		System.out.println("关闭电视机。。。。");
	}
	
}

Invoker:

package com.tian.command;

/**
 * 命令对象的执行请求
 * @author Administrator
 *
 */
public class Invoker {

	private Command command;
	
	public Invoker(Command command) {
		this.command = command;
	}
	
	public void doAction() {
		command.execute();
	}
	
}

Client:

package com.tian.command;


public class Client {

	public static void main(String[] args) {
		TVReceiver receiver = new TVReceiver();
		ConcreteCommandOnOff commandOnOff = new ConcreteCommandOnOff(receiver);
//		ConcreteCommandOnOpen commandOnOpen = new ConcreteCommandOnOpen(receiver);
		Invoker invoker = new Invoker(commandOnOff);
//		Invoker invoker = new Invoker(commandOnOpen);
		invoker.doAction();
	}
	
}

命令模式的优点:

降低对象之间的耦合

  命令模式使得发起命令的对象——客户端,和具体实现命令的对象——接收者对象完全解耦,两者不需要知道各自的实现。

新命令动态的加入到系统中

  命令模式把请求封装起来,可以动态的进行操作。

更加容易的设计组合命令

  命令模式中的命令对象能够很容易地设计成复合命令,从而使系统更加灵活、强大。

更好的扩展性

  调用同一方法实现不同的功能

命令模式的的缺点:

如果系统的命令过多,会导致系统需要大量的具体命令类

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值