设计模式之建造者模式10

来源:互联网 发布:淘宝网自动充值 编辑:程序博客网 时间:2024/05/22 15:05

设计模式之建造者模式10

背景

如果客户不仅要制造出宝马, 奔驰的车型。还要动态的设置他们去做什么。现有的动作(启动,引擎声,鸣笛,停止)。客户可以定义宝马有启动,停止。而奔驰有启动,引擎声,停止。这时该如何来做?

类图

设计模式之建造者模式

将功能区分为车型和车型的建造者。建造者通过自定义sequence来控制各自的车型的动作。不同的车型拥有不用的建造者。

代码实现

定义一个车型的抽象类

public abstract class CarModel {    private List<String> sequence;    public abstract void start();    public abstract void enginBoom();    public abstract void alarm();    public abstract void stop();    public void run() {        if(CollectionUtils.isNotEmpty(sequence)) {            for(String action : sequence) {                if("start".equals(action)) {                    this.start();                }else if("enginBoom".equals(action)) {                    this.enginBoom();                }else if("alarm".equals(action)) {                    this.alarm();                }else if("stop".equals(action)) {                    this.stop();                }            }        }    }    public void setSequence(List<String> sequence) {        this.sequence = sequence;    }}

这时有两个车型,宝马,奔驰

public class CarH1 extends CarModel{    @Override    public void start() {        System.out.println("h1 start...");    }    @Override    public void enginBoom() {        System.out.println("h1 enginBoom...");    }    @Override    public void alarm() {        System.out.println("h1 alarm...");    }    @Override    public void stop() {        System.out.println("h1 stop...");    }}
public class CarH2 extends CarModel{    @Override    public void start() {        System.out.println("h2 start...");    }    @Override    public void enginBoom() {        System.out.println("h2 enginBoom...");    }    @Override    public void alarm() {        System.out.println("h2 alarm...");    }    @Override    public void stop() {        System.out.println("h2 stop...");    }}

定义一个车型建造者的抽象类

public abstract class CarBuilder {    public abstract void setSequence(List<String> sequence);    public abstract CarModel getCarModel();}

两个车型建造者的实现

public class CarH1Builder extends CarBuilder{    private CarModel car = new CarH1();    @Override    public void setSequence(List<String> sequence) {        this.car.setSequence(sequence);    }    @Override    public CarModel getCarModel() {        return this.car;    }}
public class CarH2Builder extends CarBuilder{    private CarModel car = new CarH2();    @Override    public void setSequence(List<String> sequence) {        this.car.setSequence(sequence);    }    @Override    public CarModel getCarModel() {        return this.car;    }}

导演类,做了层封装

public class Director {    private CarH1Builder carh1Builder = new CarH1Builder();    private CarH2Builder carh2Builder = new CarH2Builder();    private List<String> sequence = new ArrayList<String>();    public CarH1 getCar1AModel() {        sequence.clear();        sequence.add("start");        sequence.add("stop");        CarModel carModel = carh1Builder.getCarModel();        carModel.setSequence(sequence);        return (CarH1)carModel;    }    public CarH1 getCar1BModel() {        sequence.clear();        sequence.add("start");        sequence.add("enginBoom");        sequence.add("alarm");        CarModel carModel = carh1Builder.getCarModel();        carModel.setSequence(sequence);        return (CarH1)carModel;    }    public CarH2 getCar2AModel() {        sequence.clear();        sequence.add("start");        sequence.add("stop");        CarModel carModel = carh2Builder.getCarModel();        carModel.setSequence(sequence);        return (CarH2)carModel;    }    public CarH2 getCar2BModel() {        sequence.clear();        sequence.add("start");        sequence.add("enginBoom");        sequence.add("alarm");        CarModel carModel = carh2Builder.getCarModel();        carModel.setSequence(sequence);        return (CarH2)carModel;    }}

客户调用各种类型的车

public class Client {    public static void main(String[] args) {        Director director = new Director();        director.getCar1AModel().run();        System.out.println();        director.getCar1BModel().run();        System.out.println();        director.getCar2AModel().run();        System.out.println();        director.getCar2BModel().run();    }}

运行结果

h1 start...h1 stop...h1 start...h1 enginBoom...h1 alarm...h2 start...h2 stop...h2 start...h2 enginBoom...h2 alarm...
1 0