菜鸟硕枫设计模式系列之15 命令模式

命令模式是一种行为模式,解耦了发送方与接收方。它将请求封装成一个对象,使得可以用不同的请求使得客户端参数化,典型应用在支持redo undo  事物等场景。

命令模式类图:
                                  菜鸟硕枫设计模式系列之15 命令模式


具体代码示例:
命令接口:
package commandPattern;

public abstract class  Command {
	public Reciever reciever;
	
	public abstract void excute();
	
	public void setReciever(Reciever reciever) {
		this.reciever = reciever;
	}
	
}


具体命令:

package commandPattern;

public class ConcreteCommandA extends Command{

	@Override
	public void excute() {
		System.out.println("hello,this is "+this.getClass()+" working");
		reciever.concreteAction4A();
	}

}


package commandPattern;

public class ConcreteCommandB extends Command{

	@Override
	public void excute() {
		System.out.println("hello,this is "+this.getClass()+" working");
		reciever.concreteAction4B();
	}

}

Invoker (命令调用者)
package commandPattern;

public class Invoker {

	private Command command;

	public void excute(){
		command.excute();
	}
	public void setCommand(Command command) {
		this.command = command;
	}

}

Reciever (命令执行者)
package commandPattern;

public class Reciever {

	void concreteAction4A(){
		System.out.println("A is working");
	}
	
	void concreteAction4B(){
		System.out.println("B is working");
	}
}


测试类:
package commandPattern;

public class testCommandPattern {

	public static void main(String[]args){
		Reciever reciever = new Reciever();
		
		Invoker a = new Invoker();
		Command commandA = new ConcreteCommandA();
		commandA.setReciever(reciever);
		a.setCommand(commandA);
		
		Invoker b = new Invoker();
		Command commandB = new ConcreteCommandB();
		commandB.setReciever(reciever);
		b.setCommand(commandB);
		
		a.excute();
		b.excute();
	}
}


说明:
这其中隐含了代理模式。其中invoker就是一个代理,对命令实现而言,它无需关心谁调用;而对调用者而言,没有必要关心调用哪个reciever方法;当然也可以用不同的reciever去实现不同的功能方法。在此只是说明执行过程和方式。

你可能感兴趣的:(java,设计模式)