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