您的位置:首页 > 其它

设计模式——命令模式

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之间还是存在着耦合关系,这层耦合需要利用工厂方法进行处理。后续我会把工厂模式结合命令模式的例子给出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: