设计模式学习笔记(五):建造者模式【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】(一)


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值