在设计模式学习笔记(三):模板方法模式中的汽车模型基础上又提出了新的需求:汽车的启动/停止/喇叭声音和引擎声音都由客户自己控制。
那么我们定义一个CarModel的抽象类,其中方法 run 和 setSequence 是抽象类实现的,其他方法都是子类自己实现。用该种方法可以解决提出新需求。先看CarModel.java程序如下:
package com.example;
import java.util.ArrayList;
public abstract class CarModel {
//该方法是为了确定执行的顺序
private ArrayList<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++){
String actionName = this.sequence.get(i);
if(actionName.equalsIgnoreCase("start")){
this.start();//开启汽车
}else if(actionName.equalsIgnoreCase("stop")){
this.stop();//停止汽车
}else if(actionName.equalsIgnoreCase("alarm")){
this.alarm();//鸣喇叭
}else if(actionName.equalsIgnoreCase("engineboom")){
this.engineBoom();//发动机轰鸣声
}
}
}
final public void setSequence(ArrayList<String> sequence){
this.sequence = sequence;
}
}
上面的程序,其中 setSequences 方法是允许客户自己设置顺序,也就是说有1W件事是这样的,1W件事那样的顺序,目前的设计满足这样的一个需求。
奔驰和宝马的两个实现类如下:
package com.example;
public class BenzModel extends CarModel{
//奔驰汽车实现父类的各种方法
protected void start() {
System.out.println("奔驰汽车跑动起来是这个样子的...");
}
protected void stop() {
System.out.println("奔驰汽车应该这样停车...");
}
protected void alarm() {
System.out.println("奔驰汽车喇叭声音听起来是这样的...");
}
protected void engineBoom() {
System.out.println("奔驰汽车发动引擎是这个样子的...");
}
}
宝马实现类:
package com.example;
public class BMWModel extends CarModel{
//宝马汽车实现父类的各种方法
protected void start() {
System.out.println("宝马汽车跑动起来是这个样子的...");
}
protected void stop() {
System.out.println("宝马汽车应该这样停车...");
}
protected void alarm() {
System.out.println("宝马汽车喇叭声音听起来是这样的...");
}
protected void engineBoom() {
System.out.println("宝马汽车发动引擎是这个样子的...");
}
}
上面的两个实现类都已经完成,按照客户的要求先要一个奔驰模型,这个模型的要求是:先发动引擎,然后再挂档启动,然后再停下来,不需要喇叭。实现类如下:
package com.example;
import java.util.ArrayList;
public class Client {
public static void main(String[] args) {
BenzModel benz = new BenzModel();
ArrayList<String> sequence = new ArrayList<String>();
//客户要求的顺序是先发动引擎,后启动,然后再停止
sequence.add("engineboom");
sequence.add("start");
sequence.add("stop");
//然后把启动顺序给奔驰轿车
benz.setSequence(sequence);
benz.run();
}
}
运行的结果是这样的:
奔驰汽车发动引擎是这个样子的...
奔驰汽车跑动起来是这个样子的...
奔驰汽车应该这样停车...
满足了基本的需求,还要下一个需求啊,然后是第2件宝马模型:只要启动/停止,其他什么都不要;第3件模型:先喇叭,在启动,然后停止;第4件.....这样的话怎么办?下篇即将给出改进的方法。
学习代码:建造者模式【Builder Pattern】(一)