设计模式之建造者模式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
- 设计模式之建造者模式10
- 设计模式之建造者
- 设计模式 之 建造者
- 设计模式之建造者
- 设计模式之建造者模式
- 设计模式之建造者模式
- 五 设计模式之建造者模式
- 设计模式之建造者模式
- C# 设计模式之 建造者模式
- 【设计模式】之 Builder 建造者模式
- 设计模式之建造者模式学习
- 设计模式之建造者模式
- 设计模式笔记之---建造者模式
- 设计模式之建造者模式
- 设计模式之建造者模式
- 设计模式之建造者模式
- java设计模式之建造者模式
- 设计模式之建造者模式
- git 获取当前分支名
- Python
- 导入excel错误:外部表不是预期的格式 解决方案
- python挑战之level 17
- 四、串口控制LED灯
- 设计模式之建造者模式10
- Linux学习笔记 -- day04 配置及使用 rz/sz 命令
- 乔治·戈登·拜伦
- 微机原理--第二章(2) 8086的引脚信号和工作模式
- Linux虚拟磁盘映像创建过程
- Basic Calculator II
- 珀西·比希·雪莱
- 如何反编译一个android程序一
- 阿道夫·希特勒