java 23种设计模式之行为型模式—命令模式(18)

java 23种设计模式之行为型模式—命令模式(18)

那么什么是命令模式呢?

命令模式就是把一个请求或者操作封装到一个对象中。从而使你可用不同的请求对客户进行参数化。用于“请求者”与“执行者”解耦,可实现二者之间的松耦合,发出命令(请求者)的责任和执行命令(执行者)的责任分割开

命令模式设计到五个角色:

1,命令(Command)角色:这是一个抽象接口,声明了一个给所有具体命令类的抽象接口,接口方法 execute()。

2,具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现l了Command接口,负责调用接收者的相应操作。execute()方法通常叫做执行方法

3,请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。

4,接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法

5,客户端(Client)角色:创建一个具体命令(ConcreteCommand)对象,确定由谁来接收。


我们以手机为例:

我们的手机可能有以下的命令可以被我们发出去

* 拍照(camera)* 拨号(dial) * 音量(sound)* 关机(off) * 开机(on)
那么我们按照命令模式来写一个关机操作手机的命令模式

A、接口:

命令角色的接口,给所有具体类使用的,什么是具体类,就是实现这个接口的类。

/*
 * 我们的手机有这些命令:
 * 拍照(camera)
 * 拨号(dial)
 * 音量(sound)
 * 关机(off)
 * 开机(on)
 * 这些命令都需要执行相应的操作
 * 而操作他们当然是在手机里操作
 */
//命令的接口
public interface Command {
	public void execute();
}

B、具体命令角色:

实现了命令角色接口的各个手机模块的类

相机模块类

/*
 * 相机的模块
 * 这些模块需要知道自己执行的命令
 */
public class CommandCamera implements Command{
	private Phone phone;
	
	public CommandCamera(Phone phone){
		this.phone = phone;
	}

	@Override
	public void execute() {
		this.phone.Camera();
	}

}
拨号模块类


/*
 * 拨号接受者的模块
 * 这些模块需要知道自己执行的命令
 */
public class CommandDial implements Command{
	private Phone phone;
	private String number;
	
	public CommandDial(Phone phone,String number){
		this.phone = phone;
		this.number = number;
	}

	@Override
	public void execute() {
		this.phone.Dial(this.number);
	}

}
声音模块类


/*
 * 声音接受者的模块
 * 这些模块需要知道自己执行的命令
 */
public class CommandSound implements Command{
	private Phone phone;
	private int sound;
	
	public CommandSound(Phone phone,int sound){
		this.phone = phone;
		this.sound = sound;
	}

	@Override
	public void execute() {
		this.phone.Sound(this.sound);
	}

}
关机模块类


/*
 *关机接受者的模块
 * 这些模块需要知道自己执行的命令
 */
public class CommandOff implements Command{
	private Phone phone;
	
	public CommandOff(Phone phone){
		this.phone = phone;
	}

	@Override
	public void execute() {
		this.phone.Off();
	}

}
开机模块类


/*
 * 开机接受者的模块
 * 这些模块需要知道自己执行的命令
 */
public class CommandOn implements Command{
	private Phone phone;
	
	public CommandOn(Phone phone){
		this.phone = phone;
	}

	@Override
	public void execute() {
		this.phone.On();
	}

}
以上就是我们五个具体的命令角色,您可以理解为手机的各个模块



C、请求者

请求者您可以理解为手机的硬件,比如,开机按钮,关机按钮,声音按钮,相机按钮和拨号按钮,他们得到一个请求,至于是什么请求,得由客户来决定,稍后我们写客户

public class Control{
	private Command camers, dial, sound, off, on;

	public Control(Command camera, Command dial, Command sound, Command off,
			Command on) {
		this.camers = camera;
		this.dial = dial;
		this.sound = sound;
		this.off = off;
		this.on = on;
	}

	public void camera() {
		this.camers.execute();
	}

	public void dial() {
		this.dial.execute();
	}

	public void sound() {
		this.sound.execute();
	}

	public void off() {
		this.off.execute();
	}

	public void on() {
		this.on.execute();
	}
}
D、接收者(Receiver)角色


接收者(Receiver)角色,他指定了,收到命令后我们应该做什么,这里您可以理解为手机的软件,比如声音模块接收到一个提高音量的请求,然后接下来就是软件去操作后台,使其音量提高

我们这里可以这里简单的模拟


/*
 * 手机里面需要定义这些命令的操作内容
 */
public class Phone {
	//拍照
	public void Camera() {
		System.out.println("相机已经打开");
	}
	
	//拨号
	public void Dial(String number) {
		System.out.println("正在拨号"+number);
	}
	
	//音量
	public void Sound(int sound) {
		System.out.println("正在调整音量:"+sound);
	}
	
	//关机
	public void Off() {
		System.out.println("正在关机");
	}
	
	//开机
	public void On() {
		System.out.println("正在开机");
	}
}
E、客户端(Client)角色


这里可以理解为,我们拿着手机

手机内部要初始化各个模块,然后我们用我们的小手去点击提高音量按钮,呵呵!


public class Client {

	public static void main(String[] args) {
		//初始化手机
		Phone phone = new Phone();
		//对各个模块进行初始化
		Command cc = new CommandCamera(phone);
		Command cd = new CommandDial(phone, "18654546565");
		CommandSound cs = new CommandSound(phone, 5);
		Command coff = new CommandOff(phone);
		Command co = new CommandOn(phone);
		
		//这里模拟按键
		Control control = new Control(cc, cd, cs, coff, co);
		control.sound();
	}

}


用户发出指令==》一个请求产生==》请求产生一个具体的命令==》然后执行命令

以上便是我所理解的命令模式,欢迎大家与我讨论,如有错误,欢迎更正


爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img