设计模式组合——命令模式组合工厂模式
利用命令模式实现司机开车的程序,车有前进、后退、左转、右转的能力。司机能够控制车进行左转右转。正常情况是一个car类,一个driver类,然后driver类里有一个car的实例,之后控制车进行前进、后退。但是,这样,车和司机的耦合程度比较高,而且如果要增加日志功能的话,就不能在driver类中,因为记录日志是系统的功能,而不是司机的功能。
上面是我的一篇设计模式中命令模式的一段话,那么,在上一篇文章中的最后,我提到一个问题就是在使用命令模式的时候,司机和车还有命令的耦合还是比较紧的,所以需要采用工厂模式进行解耦操作,下面是代码:
package com.xueyoucto.xueyou;
/**
* Created by Administrator on 2016-07-05.
*/
public interface Car {
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 HomeCar implements Car {
private String carName;
public HomeCar(String carName) {
this.carName = carName;
}
@Override
public void moveForward(int len) {
System.out.println("HomeCar"+carName + "前进" + len + "米");
}
@Override
public void moveBack(int len) {
System.out.println("HomeCar"+carName + "后退" + len + "米");
}
@Override
public void moveLeft() {
System.out.println("HomeCar"+carName + "左转");
}
@Override
public void moveRight() {
System.out.println("HomeCar"+carName + "右转");
}
}
package com.xueyoucto.xueyou;
/**
* Created by Administrator on 2016-07-05.
*/
public class JeepCar implements Car{
private String carName;
public JeepCar(String carName) {
this.carName = carName;
}
@Override
public void moveForward(int len) {
System.out.println("JeepCar"+carName + "前进" + len + "米");
}
@Override
public void moveBack(int len) {
System.out.println("JeepCar"+carName + "后退" + len + "米");
}
@Override
public void moveLeft() {
System.out.println("JeepCar"+carName + "左转");
}
@Override
public void moveRight() {
System.out.println("JeepCar"+carName + "右转");
}
}
package com.xueyoucto.xueyou;
/**
* Created by Administrator on 2016-07-05.
*/
public abstract class CarFactory {
public abstract Car createCar();
}
package com.xueyoucto.xueyou;
/**
* Created by Administrator on 2016-07-05.
*/
public class HomeCarFactory extends CarFactory{
@Override
public Car createCar() {
return new HomeCar("Audi A8");
}
}
package com.xueyoucto.xueyou;
/**
* Created by Administrator on 2016-07-05.
*/
public class JeepCarFactory extends CarFactory{
@Override
public Car createCar() {
return new JeepCar("Lx570");
}
}
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 ConcreteCommand2 implements Command {
private Car car;
public ConcreteCommand2(Car car) {
this.car = car;
}
@Override
public void moveRight() {
System.out.println("log2:moveRightBefore");
car.moveRight();
System.out.println("log2:moveRightAfter");
}
@Override
public void moveLeft() {
System.out.println("log2:moveLeftBefore");
car.moveLeft();
System.out.println("log2:moveLeftAfter");
}
@Override
public void moveBack(int len) {
System.out.println("log2:moveBackBefore" + len);
car.moveBack(len);
System.out.println("log2:moveLeftAfter" + len);
}
@Override
public void moveForward(int len) {
System.out.println("log2:moveForwardBefore" + len);
car.moveForward(len);
System.out.println("log2:moveForwardAfter" + len);
}
}
package com.xueyoucto.xueyou;
/**
* Created by Administrator on 2016-07-05.
*/
public abstract class CommandFactory {
public abstract Command createCommand(Car car);
}
package com.xueyoucto.xueyou;
/**
* Created by Administrator on 2016-07-05.
*/
public class ConcreteCommandFactory1 extends CommandFactory{
@Override
public Command createCommand(Car car) {
return new ConcreteCommand(car);
}
}
package com.xueyoucto.xueyou;
/**
* Created by Administrator on 2016-07-05.
*/
public class ConcreteCommandFactory2 extends CommandFactory{
@Override
public Command createCommand(Car car) {
return new ConcreteCommand2(car);
}
}
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!");
int i = 0;
CarFactory cf;
if(i ==0){
cf = new HomeCarFactory();
}else{
cf = new JeepCarFactory();
}
CommandFactory cmdf;
int j = 1;
if(j ==0){
cmdf = new ConcreteCommandFactory1();
}else{
cmdf = new ConcreteCommandFactory2();
}
Car c = cf.createCar();
Driver d = new Driver(c,cmdf.createCommand(c));
d.moveForward(20);
d.moveBack(11);
d.moveLeft();
d.moveRight();
}
}
运行结果如下:
需要注意的是下面这两行代码:
<span style="white-space:pre"> </span>Car c = cf.createCar();
Driver d = new Driver(c,cmdf.createCommand(c));在main函数中,如果创建Driver时使用下面的语句:Driver d = new Driver(cf.createCar(),cmdf.createCommand(cf.createCar()));运行结果上没有什么区别,但是,你会发现,现在的语义就是司机发出命令控制车A前进,命令控制车B前进。因为cf.createCar()在创建时,创建的是一个新的car实例。

303

被折叠的 条评论
为什么被折叠?



