設計模式學習筆記(五):建造者模式【Builder Pattern】(一)問題提出

    在設計模式學習筆記(三):模板方法模式中的汽車模型基礎上又提出了新的需求:汽車的啓動/停止/喇叭聲音和引擎聲音都由客戶自己控制。

    那麼我們定義一個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】(一)


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章