版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112
目录
导航
设计模式之六大设计原则
设计模式(一)单例模式
设计模式(二)工厂模式
设计模式(三)策略模式
设计模式(四)适配器模式
设计模式(五)享元模式
设计模式(六)建造者模式
设计模式(七)原型模式
设计模式(八)桥接模式
设计模式(九)外观模式
设计模式(十)组合模式
设计模式(十一)装饰器模式
设计模式(十二)代理模式
设计模式(十三)迭代器模式
设计模式(十四)观察者模式
设计模式(十五)中介者模式
设计模式(十六)命令模式
设计模式(十七)状态模式
设计模式(十八)访问者模式
设计模式(十九)责任链模式
设计模式(二十)解释器模式
设计模式(二十一)备忘录模式
设计模式(二十二)模板模式
设计模式总结篇(为什么要学习设计模式,学习设计模式的好处)
前言
命令模式单从实现上看,没有什么难度,无非就是一个命令的调用者(Invoker),几个命令类(ConcreteCommand),几个收到命令的执行类(ConcreteReceiver),有几个命令类就有几个执行了,他们之间是一对一的关系
Invoker调用者角色:接收到命令,并执行命令
Command命令角色:需要执行的所有命令都在这里声明
Receiver接受者角色:该角色就是干活的角色,命令传递到这里是应该被执行的
例子
LZ以电脑开机,关机为例子,简单的实现如下
/***
*
*@Author ChenjunWang
*@Description:抽象命令类
*@Date: Created in 23:39 2018/4/12
*@Modified By:
*
*/
public interface Command {
void execute();
void undo();
}
/***
*
*@Author ChenjunWang
*@Description:关机命令类
*@Date: Created in 0:02 2018/4/13
*@Modified By:
*
*/
public class CloseCommand implements Command {
private CloseReceiver closeReceiver;
public CloseCommand(CloseReceiver closeReceiver) {
this.closeReceiver = closeReceiver;
}
@Override
public void execute() {
closeReceiver.action();
}
@Override
public void undo() {
closeReceiver.undo();
}
}
/***
*
*@Author ChenjunWang
*@Description:开机命令类
*@Date: Created in 23:50 2018/4/12
*@Modified By:
*
*/
public class OpenCommand implements Command {
private OpenReceiver receiver;
public OpenCommand(OpenReceiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action();
}
@Override
public void undo() {
}
}
/***
*
*@Author ChenjunWang
*@Description:关机执行类
*@Date: Created in 0:03 2018/4/13
*@Modified By:
*
*/
public class CloseReceiver {
public void action(){
System.out.println("收到命令后关闭");
}
public void undo(){
System.out.println("撤销关闭任务");
}
}
/***
*
*@Author ChenjunWang
*@Description:开机执行类
*@Date: Created in 23:43 2018/4/12
*@Modified By:
*
*/
public class OpenReceiver {
public void action(){
System.out.println("收到命令后开机");
}
public void undo(){
System.out.println("撤销开机任务");
}
}
/***
*
*@Author ChenjunWang
*@Description:调用类
*@Date: Created in 23:43 2018/4/12
*@Modified By:
*
*/
public class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void action(){
command.execute();
}
}
/***
*
*@Author ChenjunWang
*@Description:测试类
*@Date: Created in 23:51 2018/4/12
*@Modified By:
*
*/
public class Test {
public static void main(String[] args) {
Invoker invoker = new Invoker();
invoker.setCommand(new OpenCommand(new OpenReceiver()));
invoker.action();
invoker.setCommand(new CloseCommand(new CloseReceiver()));
invoker.action();
}
}
执行结果如下
----------------------------
收到命令后开机
收到命令后关闭
假如你需要增加一个命令,比如待机命令,那么增加一个待机命令类,和一个待机执行类就行了,调用者每次都通过命令类来执行命令,而命令类把命令传达给接受类,最后由接收类来执行命令。
总结
优点
(1)调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Command 抽象类的execute方法就可以,不需要了解到底是哪个接收者执行。
(2)Command的子类可以非常容易地扩展,而调用者Invoker和高层次的模块Client不产生严 重的代码耦合。
缺点
(1)每次增加新的命令都需要增加命令类和接收类,若命令非常多的话,类的数量将会非常巨大
Git地址
本篇实例Github地址:https://github.com/stackisok/Design-Pattern/tree/master/src/command
有什么不懂或者不对的地方,欢迎留言。
喜欢LZ文章的小伙伴们,可以关注一波,也可以留言,LZ会回你们的。
觉得写得不错的小伙伴,欢迎转载,但请附上原文地址,谢谢^_^!