命令模式
来源:互联网 发布:买家如何避免淘宝客 编辑:程序博客网 时间:2024/06/06 16:38
命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作。
就是将请求封装装起来,对请求的操作就只需要操作这个对象就行了;
我的理解是:前提是被请求者有多种功能,比如说烧烤摊主,即能烤肉又能拷鸡翅,但是每个顾客的要求又不一样。就必须对烧烤摊主的功能分开封装,然后用一个类来管理。
最先肯定有烧烤摊主这个类:
public class Barbecuer { public void bakeMutton() { System.out.println("烤肉串"); } public void bakeChickenWing() { System.out.println("烤鸡翅"); }}
如果顾客都直接操作这个类,烧烤摊主肯定分不清谁是谁,估计就会疯了。
那么我们将烧烤摊主的功能都独立出来,用一个命令接口管理
public abstract class Command { protected Barbecuer receiver; public Command(Barbecuer receiver) { this.receiver = receiver; } public abstract void ExcuteCommand();}
不同的功能都分出来封装:
public class BakeMuttonCommand extends Command { public BakeMuttonCommand(Barbecuer receiver) { super(receiver); } @Override public void ExcuteCommand() { receiver.bakeMutton(); }}
public class BakeChickenWingCommand extends Command { public BakeChickenWingCommand(Barbecuer receiver) { super(receiver); } @Override public void ExcuteCommand() { receiver.bakeChickenWing(); }}
然后由服务员来管理顾客的点单,即由一个类来管理烧烤摊主该烤什么,这就是前面将摊主的功能都分离出来的好处。
public class Waiter { private List<Command> orders = new ArrayList<Command>(); public void setOrder(Command command) { orders.add(command); } public void cancelOrder(Command command) { orders.remove(command); } public void notifier() { for (Command command : orders) { command.ExcuteCommand(); } }}
主流程代码:
//开店准备Barbecuer boy = new Barbecuer();Command bakeMuttonCommand = new BakeMuttonCommand(boy);Command bakeChickenWingCommand = new BakeChickenWingCommand(boy); Waiter girl = new Waiter();//服务员根据客户点单下命令给摊主做什么烧烤girl.setOrder(bakeMuttonCommand);girl.setOrder(bakeMuttonCommand);girl.setOrder(bakeChickenWingCommand);girl.notifier();
现在,如果还需要烤扇贝,那么只需要把摊主的这个技能再封装出来,开店的时候在菜单里加上这一项,顾客点单了服务员命令摊主做就是了。
0 0
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- stl中的upper_bound和lower_bound
- JDK源码分析之输入输出流 超~详细解析
- 多行文本超出时显示省略号----jquery.ellipsis.js
- struct usb_bus
- TortoiseGit 中文语言包检测不出来
- 命令模式
- C语言itoa()函数和atoi()函数详解---整数与字符互相转换C函数
- Android检测url地址是否可达
- LEAP环境如何使用和配置RestService
- 架构设计:负载均衡层设计方案(5)——LVS单节点安装
- 5-10 顺序存储的二叉树的最近的公共祖先问题 (25分)
- 301重定向
- poj3090 Visible Lattice Points(法雷级数)
- 中文字体库转换成16X16点阵 另外附上ASCII码转换8X16点阵