最近学习到设计模式,现总结个人学习命令模式内容【注重的是命令发送者与命令执行者解耦 】。
上一篇:Java设计模式-享元模式
定义
将“动作的请求者”从“动作的执行者”对象中解耦。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
优缺点
优点
解耦
发起命令者不要再知道具体接受者对象是什么,如何实现的,命令对象会负责让接收则只需请求的动作。
缺点
系统中出现过多的命令类,增加了系统的复杂对。
实现
角色
- Command:抽象命令接口.
- ConcreteCommand:具体命令.
- Receiver:最终执行命令的对象.
- Invoker:命令对象的入口.
代码
Command对象接口以及具体命令
/* 命令接口
*/
public interface Command {
public void execute();
}
/*//类适配 收音机开机的命令
class RadioOpenCommand extends RadioAppliances implements Command{
@Override
public void execute() { this.open(); }
}*/
//对象适配[建议使用对象适配,因收音机可以有多类] 收音机开机的命令
class RadioOpenCommand implements Command{
Appliances appliances;
public RadioOpenCommand(Appliances appliances) {
this.appliances = appliances;
}
@Override
public void execute() { this.appliances.open(); }
}
//对象适配[建议使用对象适配,因收音机可以有多类] 收音关机机的命令
class RadioCloseCommand implements Command{
Appliances appliances;
public RadioCloseCommand(Appliances appliances) {
this.appliances = appliances;
}
@Override
public void execute() { this.appliances.close(); }
}
Receiver最终只需命令的对象,以及对象抽象类
/* 执行命令抽象类
*/
public abstract class Appliances {
public abstract void open();
public abstract void close();
}
//最终执行命令具体类
class RadioAppliances extends Appliances{
@Override
public void open() {
System.out.println("打开收音机...");
}
@Override
public void close() {
System.out.println("关闭收音机...");
}
}
Invoker:命令对象的入口.
public class Controller {
HashMap<Integer,Command> opendcoms=new HashMap<>();
HashMap<Integer,Command> colsecoms = new HashMap<>();
// 给我们的按钮设置你需要的命令
public void setCommand(int no, Command opencom, Command closcom) {
opendcoms.put(no, opencom);
colsecoms.put(no, closcom);
}
//执行打开命令
public void open(int on){
opendcoms.get(on).execute();
}
//执行关闭命令
public void close(int on){
colsecoms.get(on).execute();
}
}
测试
命令模式重点在于命令发送者与命令执行者解耦
以上仅为个人学习,如果错误望指出,谢谢。