设计模式组合——命令模式组合工厂模式

设计模式组合——命令模式组合工厂模式

利用命令模式实现司机开车的程序,车有前进、后退、左转、右转的能力。司机能够控制车进行左转右转。正常情况是一个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实例。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值