zoukankan      html  css  js  c++  java
  • Builder模式


    /**抽象Product
    * Created by marcopan on 17/10/23.
    */
    public abstract class CarModel {
        private List<String> sequence = new ArrayList<String>();

    protected abstract void start();
    protected abstract void stop();
    protected abstract void alarm();
    protected abstract void engineBoom();

    final public void run() {
    for (int i = 0; i < this.sequence.size(); i ++) {
    if ("start".equalsIgnoreCase(this.sequence.get(i))) {
    this.start();
    } else if ("stop".equalsIgnoreCase(this.sequence.get(i))) {
    this.stop();
    } else if ("alarm".equalsIgnoreCase(this.sequence.get(i))) {
    this.alarm();
    } else if ("engine boom".equalsIgnoreCase(this.sequence.get(i))) {
    this.engineBoom();
    }
    }
    }

    final public void setSequence(List<String> sequence) {
    this.sequence = sequence;
    }

    final public List<String> getSequence() {
    return sequence;
    }
    }

    /**抽象builder
    * Created by marcopan on 17/10/23.
    */
    public interface CarBuilder {
    public abstract void setSequence(List<String> sequence);
    //设置完毕顺序后,就可以直接拿到这个车辆模型了
    public abstract CarModel getCarModel();
    }

    /**concrete builder
    * Created by marcopan on 17/10/23.
    */
    public class BMWBuilder implements CarBuilder {
    private CarModel bmw = new BMWModel();

    @Override
    public void setSequence(List<String> sequence) {
    this.bmw.setSequence(sequence);
    }

    @Override
    public CarModel getCarModel() {
    return this.bmw;
    }
    }

    public class BenzBuilder implements CarBuilder {
    private CarModel benz = new BenzModel(); //奔驰车模型

    @Override
    public void setSequence(List<String> sequence) {
    this.benz.setSequence(sequence);
    }

    @Override
    public CarModel getCarModel() {
    return this.benz;
    }
    }

    public class Director {
    private List<String> sequence = new ArrayList<String>();
    private CarBuilder benzBuilder = new BenzBuilder();
    private CarBuilder bmwBuilder = new BMWBuilder();

    //A顺序的奔驰车
    public CarModel getABenzModel() {
    this.sequence.clear();
    this.sequence.add("start");
    this.sequence.add("stop");
    this.benzBuilder.setSequence(sequence);
    return this.benzBuilder.getCarModel();
    }

    //B顺序的奔驰车
    public CarModel getBBenzModel() {
    this.sequence.clear();
    this.sequence.add("engine boom");
    this.sequence.add("start");
    this.sequence.add("stop");
    this.benzBuilder.setSequence(sequence);
    return this.benzBuilder.getCarModel();
    }

    //C顺序的宝马车
    public CarModel getCBMWModel() {
    this.sequence.clear();
    this.sequence.add("start");
    this.sequence.add("alarm");
    this.sequence.add("stop");
    this.bmwBuilder.setSequence(sequence);
    return this.bmwBuilder.getCarModel();
    }

    //D顺序的宝马车
    public CarModel getDBMWModel() {
    this.sequence.clear();
    this.sequence.add("engine boom");
    this.sequence.add("start");
    this.bmwBuilder.setSequence(sequence);
    return this.bmwBuilder.getCarModel();
    }
    }

    public class Client {
    public static void main(String[] args) {
    Director director = new Director();

    director.getABenzModel().run();
    director.getBBenzModel().run();
    director.getCBMWModel().run();
    }
    }
  • 相关阅读:
    递归
    数据结构与算法-复杂度分析
    'latin-1' codec can't encode characters in position解决字符问题
    redis理解
    spring 嵌套事务问题
    Parameterized testing with any Python test framework
    分布式事务测试考虑点
    python orm / 表与model相互转换
    Python多线程、多进程
    JS运动
  • 原文地址:https://www.cnblogs.com/panning/p/7747725.html
Copyright © 2011-2022 走看看