目的:将请求方与接收方完全解耦
UML类图:(图片来源:http://www.uml.org.cn/oobject/201404035.asp)
角色:
1.客户端角色(Client)
2.抽象命令角色(Command)
3.具体命令角色(ConcreteCommand):内部有Receiver实例,懂!!!
4.调用者角色(Invoker):命令请求者(发出者),内部有ConcreteCommand实例
5.接收者角色(Receiver):命令接收者,执行相应操作。
示例:模拟计算机启动过程,代码如下
package pers.liu.apattern.cpattern; /** * @author Mr.Liu * @description: 接收者角色(接口):主板 */ public interface MainBoardApi { public void open(); }
package pers.liu.apattern.cpattern; /** * @author Mr.Liu * @description: 接收者角色(具体):Giga的主板 */ public class GigaMainBoard implements MainBoardApi { @Override public void open() { // TODO Auto-generated method stub System.out.println("GigaMainBoard is booting"); System.out.println("GigaMainBoard start-up"); } }
package pers.liu.apattern.cpattern; /** * @author Mr.Liu * @description: 抽象命令角色:发送的命令,此处可理解为电线,连接开机按钮和主板 */ public interface Command { public void execute(); }
package pers.liu.apattern.cpattern; /** * @author Mr.Liu * @description: 机箱,执行开机操作 */ public class Box { private Command command = null; public Box(Command command){ this.command = command; } public void openButtonPressed(){ command.execute(); } }
package pers.liu.apattern.cpattern; /** * @author Mr.Liu * @description: 具体命令角色:此处可理解为电线,连接开机按钮和主板 */ public interface Command { public void execute(); }
/** * @Author: Mr.Liu * @Date: 15:35 2018/6/7 * @Modified by: * @Description: 客户端角色 */ public class Client { Public static void main(String[] args){ MainBoardApi mainBoardApi = new GigaMainBoard(); Command command = new OpenCommand(mainBoardApi); Box box = new Box(command);box.openButtonPressed(); } }