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/天,具体规则查看活动详情