命令模式

命令模式定义:

命令模式是一个高内聚的模式,定义为将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和回复功能。

命令模式的类图如下:



         假设一种场景,一个公司完成一个工程需要三个部门协调完成,部门A、B、C,每一个部门完成都需要一系列方法,完成一个工程之后客户需要做修改,先找来A部门的人谈,然后再找B、再找C,时间久了客户就受不了了,他说:我只要说明我要做什么修改,我不管你们由哪几个部门配合做,我不要一个一个谈,你给我一个接口人,我把需求只给接口人讲,然后我就不管了,接口人去执行一个响应的修改命令,而这个具体的命令里面就包含了哪几个部门需要执行哪些操作。

        以上的这个场景就应该用命令模式来解决

命令角色:需要执行的所有命令都在这里声明(命令)

接收者角色:该角色是真正干活的角色,命令传递到这里执行(部门A,B,C)

调用者角色:接收到命令,并执行命令(接头人)


命令模式实现:

抽象接收者:定义一组接收者

package design.command;

public abstract class Receive {

	public abstract void doSomthing();
}

具体接收者1:执行具体操作

package design.command;

public class AddReceive extends Receive {

	@Override
	public void doSomthing() {
		System.out.println("执行添加操作");
	}

}

接收者2:执行具体操作

package design.command;

public class DelReceive extends Receive {

	@Override
	public void doSomthing() {

		System.out.println("执行删除操作");
	}

}

抽象命令角色:定义一组命令,将所有的接收者聚合进来

package design.command;

public abstract class Command {

	
	AddReceive add = new AddReceive();
	DelReceive del = new DelReceive();
	public abstract void execute();
}

具体命令1:

package design.command;

public class AddCommand extends Command {

	@Override
	public void execute() {
		super.add.doSomthing();
	}

}

命令2:

package design.command;

public class DelCommand extends Command {

	@Override
	public void execute() {
		super.del.doSomthing();
	}

}

调用者:

package design.command;

public class Invoker {

	private Command command;
	
	public void action(){
		
		command.execute();
	}
	
	public void setCommand(Command command){
		this.command = command;
	}
}
测试调用:

package design.command;

public class TestMain {

	public static void main(String[] args) {
		Invoker inv = new Invoker();
		Command com = new DelCommand();
		inv.setCommand(com);
		inv.action();
	}
}

命令模式的优点

类间解耦:调用者与接收者角色之间没有任何依赖关系,调用者只需要调用Command抽象类的execute方法,不需要了解底层是那个接受者(客户需求变更,只需要和接口人(Invoker)打交道,Invoker直接和Command打交道不不用管是谁来执行)

可扩展性:Command子类可以非常容易地扩展,而调用者Invoker和高层的模块Client不产生代码耦合

还有返回机制没有说,由于吃了安眠药,眼睛有点模糊了,就写到这里吧。。。


设计模式虽然不是一门技术,但是对我们平时编程与阅读API很有帮助,个人也只是皮毛重点还是应用,欢迎大神们加群一起探讨  群号:167014883


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值