设计模式-建造者模式+模板模式=自定义用户需求

    本博原创禁止转载、拷贝、拍照等一切商业目地,否则将保留法律权利!

-----

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")){  //如果是start关键字,

this.start();  //开启汽车

}else if(actionName.equalsIgnoreCase("stop")){ //如果是stop关键字

this.stop(); //停止汽车

}else if(actionName.equalsIgnoreCase("alarm")){ //如果是alarm关键字

this.alarm(); //喇叭开始叫了

}else if(actionName.equalsIgnoreCase("engine boom")){  //如果是engine boom关键字

this.engineBoom();  //引擎开始轰鸣

}

}

}

//把传递过来的值传递到类内

final public void setSequence(ArrayList<String> sequence){

this.sequence = sequence;

}

}

--------------------------

public abstract class CarBuilder {

//建造一个模型,你要给我一个顺序要,就是组装顺序

public abstract void setSequence(ArrayList<String> sequence);

//设置完毕顺序后,就可以直接拿到这个这两模型

public abstract CarModel getCarModel();

}

-------------------------

public class BMWModel extends CarModel {

@Override

protected void alarm() {

System.out.println("宝马车的喇叭声音是这个样子的...");

}

@Override

protected void engineBoom() {

System.out.println("宝马车的引擎室这个声音的...");

}

@Override

protected void start() {

System.out.println("宝马车跑起来是这个样子的...");

}

@Override

protected void stop() {

System.out.println("宝马车应该这样停车...");

}

}

-------------------------

public class BMWBuilder extends CarBuilder {

private BMWModel bmw = new BMWModel();

@Override

public CarModel getCarModel() {

return this.bmw;

}

@Override

public void setSequence(ArrayList<String> sequence) {

this.bmw.setSequence(sequence);

}

}

--------------------------

public class BenzModel extends CarModel {

@Override

protected void alarm() {

System.out.println("奔驰车的喇叭声音是这个样子的...");

}

@Override

protected void engineBoom() {

System.out.println("奔驰车的引擎室这个声音的...");

}

@Override

protected void start() {

System.out.println("奔驰车跑起来是这个样子的...");

}

@Override

protected void stop() {

System.out.println("奔驰车应该这样停车...");

}

}

-----------------------------

public class BenzBuilder extends CarBuilder {

private BenzModel benz = new BenzModel();

@Override

public CarModel getCarModel() {

return this.benz;

}

@Override

public void setSequence(ArrayList<String> sequence) {

this.benz.setSequence(sequence);

}

}

----------------------------------

public class Director {

private ArrayList<String> sequence = new ArrayList();

private BenzBuilder benzBuilder = new BenzBuilder();

private BMWBuilder bmwBuilder = new BMWBuilder();

/*

* A类型的奔驰车模型,先start,然后stop,其他什么引擎了,喇叭一概没有

*/

public BenzModel getABenzModel(){

//清理场景,这里是一些初级程序员不注意的地方

this.sequence.clear();

//这只ABenzModel的执行顺序

this.sequence.add("start");

this.sequence.add("stop");

//按照顺序返回一个奔驰车

this.benzBuilder.setSequence(this.sequence);

return (BenzModel)this.benzBuilder.getCarModel();

}

/*

* B型号的奔驰车模型,是先发动引擎,然后启动,然后停止,没有喇叭

*/

public BenzModel getBBenzModel(){

this.sequence.clear();

this.sequence.add("engine boom");

this.sequence.add("start");

this.sequence.add("stop");

this.benzBuilder.setSequence(this.sequence);

return (BenzModel)this.benzBuilder.getCarModel();

}

/*

* C型号的宝马车是先按下喇叭(炫耀嘛),然后启动,然后停止

*/

public BMWModel getCBMWModel(){

this.sequence.clear();

this.sequence.add("alarm");

this.sequence.add("start");

this.sequence.add("stop");

this.bmwBuilder.setSequence(this.sequence);

return (BMWModel)this.bmwBuilder.getCarModel();

}

/*

* D类型的宝马车只有一个功能,就是跑,启动起来就跑,永远不停止,牛叉

*/

public BMWModel getDBMWModel(){

this.sequence.clear();

this.sequence.add("start");

this.bmwBuilder.setSequence(this.sequence);

return (BMWModel)this.benzBuilder.getCarModel();

}

/*

* 这边很可以有很多方法,你可以先停止,然后再启动,或者一直停着不动,静态的嘛

* 导演类嘛,按照什么顺序是导演说了算

*/

}

-------------------

public class Client {

public static void main(String[] args) {

Director director = new Director();

//1W辆A类型的奔驰车

for(int i=0;i<10000;i++){

director.getABenzModel().run();

}

//100W辆B类型的奔驰车

for(int i=0;i<1000000;i++){

director.getBBenzModel().run();

}

//1000W量C类型的宝马车

for(int i=0;i<10000000;i++){

director.getCBMWModel().run();

}

}

}

案例说明:该模式虽类似工厂模式,单强调用户顺序需求,也就是自定义需求,结合模板模式,可以方便的独立扩展。

    本博原创禁止转载、拷贝、拍照等一切商业目地,否则将保留法律权利!
时间: 2024-10-04 16:19:00

设计模式-建造者模式+模板模式=自定义用户需求的相关文章

Java设计模式(七)策略模式 模板模式

(十三)策略模式 策略模式定义了多个封装起来的算法,封装的算法可以相互替换,并且算法的变化不会影响到使用算法的客户.借用另一位大神的例子. interface ICalculator{ public int calculate(String exp); } abstract class AbstractCalculator{ public int[] split(String exp,String opt){ String array[] = exp.split(opt); int arrayI

Head First 设计模式系列之一----模板模式

开篇序言:四人帮的设计模式对于我这个菜鸟看着打瞌睡,后面果断买了一本head first的,感觉还可以像看报纸似的,花了一个寒假的晚上看了大半,确实内容也挺吸引人的,讲的很风趣.否则我也不可能,大过年的小伙伴们还在外面耍,自己还在那里装B.可是看完的困惑也随之而来,我怎么才能熟练的操练这些模式呢!书上讲的头头是道,可是实际中我们确不知道怎么运用!后面看到别人牛逼的都是随便一个模式都能脱口面而出,还有就是实际项目接触多了,肯定也有一定的职业嗅觉!所以希望自己也能够通过写博客,让自己对设计模式有一个

设计模式整理_模板模式

模板模式在父类中定义了一个方法的模板,而子类可以动态的实现模板成分方法,但是模板中的方法顺序无法改变. 父类中的模板方法往往申明为final,用来保证方法不被子类覆盖,因为作为模板,是不可以改变的,但是模板方法内的一系列方法,可以由子类自己静态实现,同时在父类的模板方法中,可以定义钩子(hook)方法.方便子类对于模板方法的优化.下面用两个例子说明. /*没有钩子(hook)的模板方法,此时模板方法无法修改*/ public abstract class Model { public final

设计模式之&mdash;&mdash;Template模板模式

Template模式又叫模板模式,是在父类中定义处理流程的框架,在子类中实现具体处理逻辑的模式.当父类的模板方法被调用时程序行为也会不同,但是,不论子类的具体实现如何,处理的流程都会按照父类中所定义的那样进行. 示例程序: 将一段字符串和字符循环显示五次的程序: AbstractDisplay 父类抽象的模板,里面定义了处理流程,但是没有具体把实现写出来 package site.wangxin520.gof.template; /** * 模板模式的模板,使用的是抽象类和抽象方法. * 在此模

设计模式之GOF23模板模式

模板模式template method 场景:具有具体流程,但具体某一步的业务不同 到银行办理业务:排队取号,办理业务,给员工打分 请客吃饭:等待,点单,吃饭,结账 模板方法模式介绍:模板方法是编程常用的模式,它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤. 核心:处理步骤(流程)由父类定义好,具体实现延迟到子类中定义 结构:抽象父类(决定流程以及抽象的业务方法等着子类实现),不同的子类实现不同的业务,客户端(

java模式:模板模式的简单理解

1.模板模式就是用虚类作为基类将几个要执行差不多操作中相同的部分提取出来,不同的部分各自实现! 2.下面给出简单栗子: 我要进行的操作是将大象和狐狸放入冰箱,放入大象和狐狸有相同的步骤:开冰箱和关冰箱,这个操作在基类中实现就好,而不同的在于具体操作部分: 一,大象太胖了,要测量并切片才能放入冰箱 二,狐狸太臭了,要洗干净并擦干 所以程序如下: 1.基类:BasicFridgeOperation.java package com.learn.templateMode; /** * Created

Java设计模式—单例模式和模板模式

1.单例模式方法:类构造方法私有的,类里面有个静态类对象用来保存这个类对象,并且这个类提供获取该类对象的静态方法. /** * 单例设计模式 * @author Admin * */ public class Design1 { private String name; private static Design1 d; private Design1(String name){ this.name = name; } public static Design1 getDesign(){ if(

Spring中的设计模式:模板模式

导读 模板模式在是Spring底层被广泛的应用,比如事务管理器的实现,JDBC模板的实现. 文章首发于作者的微信公众号[码猿技术专栏] 今天就来谈谈「什么是模板模式」.「模板模式的优缺点」.「模板模式的简单演示」.「模板模式在Spring底层的实现」. 什么是模板模式 模板模式首先要有一个抽象类,这个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型模式. 定义:「定义一个操作中的算法骨架,而将算法的一些步骤延

设计模式系列 - 行为型模式(下)

行为设计模式是识别对象之间的通信模式,行为模式涉及对象之间的责任分配,或者,将行为封装在对象中并将请求委托给它,也就是对象之间的关系. 涉及:* 状态模式中介模式* 观察者模式备忘录模式迭代器模式命令模式* 策略模式* 模板模式* 访客模式示例责任链模式 观察者模式 根据GoF定义,observer模式定义了对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖关系都会被自动通知和更新.它也被称为发布-订阅模式.在观察者模式中,有许多观察者(订阅者对象)正在观察特定的主题(发布者对象).观