1. 程式人生 > >模板方法模式【Template Method Pattern】

模板方法模式【Template Method Pattern】

週三,9:00,我剛剛坐到位置,開啟電腦準備開始幹活。
“小三,小三,叫一下其它同事,到會議室,開會”老大跑過來吼,帶著淫笑。還不等大家坐穩,老
大就開講了,
“告訴大家一個好訊息,昨天終於把牛叉模型公司的口子打開了,要我們做悍馬模型,雖然是第一個
車輛模型,但是我們有能力,有信心做好,我們一定要…(中間省略20 分鐘的講話,如果你聽過領導人的
講話,這個你應該能夠續上)”
動員工作做完了,那就開始壓任務了,“這次時間是非常緊張的,只有一個星期的時間,小三,你負責
在一個星期的時間把這批10 萬車模(注:車模是車輛模型的意思,不是香車美女那個車模)建設完成…”
“一個星期?這個…,是真做不完,要做分析,做模板,做測試,還要考慮擴充套件性、穩定性、健壯性
等,時間實在是太少了”還沒等老大說完,我就急了,再不急我的小命就折在上面了!
“那這樣,你只做實現,不考慮使用設計模式,擴充套件性等都不用考慮”老大又把我壓回去了。
“不考慮設計模式?那…”
哎,領導已經佈置任務了,那就開始死命的做吧,命苦不能怨政府,點背不能怪社會呀,然後就開始
準備動手做,在做之前先介紹一下我們公司的背景,我們公司是做模型生產的,做過橋樑模型、建築模型、
機械模型,甚至是一些政府、軍事的機密模型,這個不能說,就是把真實的實物按照一定的比例縮小或放
大,用於試驗、分析、量化或者是銷售等等,上面提到的牛叉模型公司專門銷售車輛模型的公司,自己不
生產,我們公司是第一次從牛叉模型公司接單,那我怎麼著也要把活幹好,可時間很緊張呀,怎麼辦?
既然領導都說了,不考慮擴充套件性,那好辦,我先設計個類圖:

public abstract class HummerModel {
	/*
	* 首先,這個模型要能夠被髮動起來,別管是手搖發動,還是電力發動,反正
	* 是要能夠發動起來,那這個實現要在實現類裡了
	*/
	public String name;
	public HummerModel(String name) {
		this.name=name;
	}
	/*
	* 首先,這個模型要能夠被髮動起來,別管是手搖發動,還是電力發動,反正
	* 是要能夠發動起來,那這個實現要在實現類裡了
	*/
	protected abstract void start();
	//能發動,那還要能停下來,那才是真本事
	protected abstract void stop();
	//喇叭會出聲音,是滴滴叫,還是嗶嗶叫
	protected abstract void alarm();
	//引擎會轟隆隆的響,不響那是假的
	protected abstract void engineBoom();
	//那模型應該會跑吧,別管是人推的,還是電力驅動,總之要會跑
	final public void run() {
		//先發動汽車
		this.start();
		//引擎開始轟鳴
		this.engineBoom();
		//喇嘛想讓它響就響,不想讓它響就不響
		if(this.isAlarm()){
			this.alarm();
		}
		//到達目的地就停車
		this.stop();
	}
	//鉤子方法,預設喇叭是會響的
	protected boolean isAlarm(){
		return true;
	}
}
public class Smark extends HummerModel {

	private String name;
	public static boolean falg=true;
	public Smark(String name) {
		super(name);
		this.name=name;
	}

	@Override
	protected void start() {
		System.out.println(name+"開啟了");
	}

	@Override
	protected void stop() {
		System.out.println(name+"停止了");
	}

	@Override
	protected void alarm() {
		System.out.println(name+"喇叭擋擋的");
	}

	@Override
	protected void engineBoom() {
		System.out.println(name+"傳送機嘀嘀的");
	}

	
	@Override
	protected boolean isAlarm() {
		// TODO Auto-generated method stub
		return falg;
	}
	
	private void setAlarm(boolean b) {
		// TODO Auto-generated method stub
		falg=b;
	}

	public static void main(String[] args) {
		Smark smark=new Smark("大奔");
		smark.setAlarm(false);
		smark.run();
	}

}