设计模式——命令模式
2016-07-05 16:46
267 查看
设计模式——命令模式
利用命令模式实现司机开车的程序,车有前进、后退、左转、右转的能力。司机能够控制车进行左转右转。正常情况是一个car类,一个driver类,然后driver类里有一个car的实例,之后控制车进行前进、后退。但是,这样,车和司机的耦合程度比较高,而且如果要增加日志功能的话,就不能在driver类中,因为记录日志是系统的功能,而不是司机的功能。下面看代码:package com.xueyoucto.xueyou; /** * Created by Administrator on 2016-07-05. */ public class Car { private String carName; public Car(String carName) { this.carName = carName; } public void moveForward(int len) { System.out.println(carName + "前进" + len + "米"); } public void moveBack(int len) { System.out.println(carName + "后退" + len + "米"); } public void moveLeft() { System.out.println(carName + "左转"); } public void moveRight() { System.out.println(carName + "右转"); } }
package com.xueyoucto.xueyou; /** * Created by Administrator on 2016-07-05. */ public interface Command { public void moveForward(int len); public void moveBack(int len); public void moveLeft(); public void moveRight(); }
package com.xueyoucto.xueyou; /** * Created by Administrator on 2016-07-05. */ public class ConcreteCommand implements Command{ private Car car; public ConcreteCommand(Car car) { this.car = car; } @Override public void moveRight() { System.out.println("log:moveRightBefore"); car.moveRight(); System.out.println("log:moveRightAfter"); } @Override public void moveLeft() { System.out.println("log:moveLeftBefore"); car.moveLeft(); System.out.println("log:moveLeftAfter"); } @Override public void moveBack(int len) { System.out.println("log:moveBackBefore" + len); car.moveBack(len); System.out.println("log:moveLeftAfter" + len); } @Override public void moveForward(int len) { System.out.println("log:moveForwardBefore" + len); car.moveForward(len); System.out.println("log:moveForwardAfter" + len); } }
package com.xueyoucto.xueyou; /** * Created by Administrator on 2016-07-05. */ public class Driver { private Car car; private Command command; public Driver(Car car, Command command) { this.car = car; this.command = command; } public void moveForward(int len) { command.moveForward(len); } public void moveBack(int len) { command.moveBack(len); } public void moveLeft() { command.moveLeft(); } public void moveRight() { command.moveRight(); } }
package com.xueyoucto.xueyou; /** * Hello world! */ public class App { public static void main(String[] args) { System.out.println("Hello World!"); Car c = new Car("Lx570"); Command cmd = new ConcreteCommand(c); Driver d = new Driver(c,cmd); d.moveForward(10); d.moveBack(20); d.moveLeft(); d.moveRight(); } }
运行结果:
细心的读者能够发现,car和command以及driver之间还是存在着耦合关系,这层耦合需要利用工厂方法进行处理。后续我会把工厂模式结合命令模式的例子给出来。
相关文章推荐
- UFLDL Tutorial学习笔记(一)Linear&Logistic&Softmax Regression
- RGB颜色二值化
- CentOS下mysql数据库常用命令总结
- Livecoding.tv2.5发布,增加“用户搜索引擎”功能,方便用户找到匹配的程序员
- centos中命令自动补全
- 数据类操作之文件存储跟读写
- SQL常见问题
- Caffe学习日记10
- POJ 3258 River Hopscotch [NOIP2015 D2T1] (洛谷 P2678 跳石头)
- 电压跟随器
- 关于vim go环境的配置问题
- 乌班图安装
- VC++界面编程之--阴影窗口的实现详解
- Java内存模型
- iOS开发集成支付宝支付遇到的"_EVP_DecodeBlock",referenced from:等13个错误的解决办法
- uboot.2015.07移植之驱动DM9000(8)
- html5中新增的主题元素标签
- Description Resource Path Location Type ArtifactTransferException: Could not transfer artifact
- java 代码加载顺序
- Android性能优化 浅析