标签:
四。 模板方法模式
Definition: Define the skeleton of an algorithm in an operation, deferring some steps to subclasses.
Templet Method lets subclasses redefine certain steps of an algorithm without changing the algorithm‘s structure.
它包含一个抽象模板和一些具体的模板。
抽象模板中包含两类方法:
Demo Coding:
package com.model; public abstract class HummerModel { /** * 首先,这个模型要能发动起来,不管是电力发动还是手摇发动 * 所以具体是怎么发动就要根据不同的型号自己实现发动的方法 */ public abstract void start(); /** * 不仅能够发动,还要能够停止 */ public abstract void stop(); /** * 按喇叭会响 */ public abstract void alarm(); /** * 发动引擎时有隆隆声 */ public abstract void engineBoom(); public void run() { this.start(); this.engineBoom(); this.alarm(); this.stop(); } } package com.model; public class HummerH1Model extends HummerModel { @Override public void start() { // TODO Auto-generated method stub System.out.println("H1型号是这样启动的....."); } @Override public void stop() { // TODO Auto-generated method stub System.out.println("H1型号是这样停止的....."); } @Override public void alarm() { // TODO Auto-generated method stub System.out.println("H1型号是这样鸣笛的......"); } @Override public void engineBoom() { // TODO Auto-generated method stub System.out.println("H1型号是这样发动引擎的......"); } } package com.model; public class HummerH2Model extends HummerModel { @Override public void start() { // TODO Auto-generated method stub System.out.println("H2型号是这样启动的......"); } @Override public void stop() { // TODO Auto-generated method stub System.out.println("H2型号是这样停止的......"); } @Override public void alarm() { // TODO Auto-generated method stub System.out.println("H2型号是这样鸣笛的......"); } @Override public void engineBoom() { // TODO Auto-generated method stub System.out.println("H2型号是这样发动引擎的......"); } } package com.model; public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //某公司要H1模型的悍马汽车 HummerModel hm = new HummerH1Model(); //H1模型演示如下 hm.run(); } }
五。 建造者模式(Builder Pattern)
Definition: Separate the construction of a complex object from its representation so that the same
construction process can create different representations.
在一般的建造者模式中,有如下4个角色:
所以说,不论是经由模板模式构建的产品类还是抽象或具体的建造者,对于客户都是屏蔽的,客户只需要将他的具体需求告诉导演类,最终由导演类统筹安排,将结果返回给客户。
建造者模式的使用场景有:
Demo Coding:
/*-------------------------模板方法模式的实现-----------------------------*/ package com.builderPattern; 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() { //循环一遍sequence,谁在前就限制性谁 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("engine boom")) this.engineBoom(); } } final public void setSequence(ArrayList<String> sequence) { this.sequence = sequence; } } package com.builderPattern; public class BenzModel extends CarModel { @Override protected void start() { // TODO Auto-generated method stub System.out.println("奔驰是这样run...."); } @Override protected void stop() { // TODO Auto-generated method stub System.out.println("奔驰是这样stop...."); } @Override protected void alarm() { // TODO Auto-generated method stub System.out.println("奔驰是这样alarm...."); } @Override protected void engineBoom() { // TODO Auto-generated method stub System.out.println("奔驰是这样engine boom....."); } } package com.builderPattern; public class BMWModel extends CarModel { @Override protected void start() { // TODO Auto-generated method stub System.out.println("宝马是这样start...."); } @Override protected void stop() { // TODO Auto-generated method stub System.out.println("宝马是这样stop...."); } @Override protected void alarm() { // TODO Auto-generated method stub System.out.println("宝马是这样alarm...."); } @Override protected void engineBoom() { // TODO Auto-generated method stub System.out.println("宝马是这样engine boom...."); } } /*-------------------------抽象建造者-----------------------------*/ package com.builderPattern; import java.util.ArrayList; public abstract class CarBuilder { //建造一个模型,你要给我一个顺序,就是组装顺序 public abstract void setSequence(ArrayList<String> sequence); //设置完顺序后,既可以直接拿到这个车辆模型 public abstract CarModel getCarModel(); } /*--------------具体建造者的实现,返回一个具体的model------------------------*/ package com.builderPattern; import java.util.ArrayList; public class BenzBuilder extends CarBuilder { private BenzModel benz = new BenzModel(); @Override public void setSequence(ArrayList<String> sequence) { // TODO Auto-generated method stub this.benz.setSequence(sequence); } @Override public CarModel getCarModel() { // TODO Auto-generated method stub return this.benz; } } package com.builderPattern; import java.util.ArrayList; public class BMWBuilder extends CarBuilder { private BMWModel bmw = new BMWModel(); @Override public void setSequence(ArrayList<String> sequence) { // TODO Auto-generated method stub this.bmw.setSequence(sequence); } @Override public CarModel getCarModel() { // TODO Auto-generated method stub return this.bmw; } } /*-------------------------导演类的实现,实现客户的需求-------------------------*/ package com.builderPattern; import java.util.ArrayList; public class Director { private ArrayList<String> sequence = new ArrayList<String>(); private BenzBuilder benzBuilder = new BenzBuilder(); private BMWBuilder bmwBuilder = new BMWBuilder(); /** * 获得A类型的奔驰汽车 * @return */ public BenzModel getABenzModel() { this.sequence.clear(); this.sequence.add("start"); this.sequence.add("stop"); this.benzBuilder.setSequence(sequence); return (BenzModel) this.benzBuilder.getCarModel(); } /** * 获得B类型的奔驰汽车 * @return */ public BenzModel getBBenzModel() { this.sequence.clear(); this.sequence.add("engine boom"); this.sequence.add("start"); this.sequence.add("stop"); this.benzBuilder.setSequence(sequence); return (BenzModel) this.benzBuilder.getCarModel(); } /** * 获得A类型的宝马车型 * @return */ public BMWModel getABMWModel() { this.sequence.clear(); this.sequence.add("alarm"); this.sequence.add("start"); this.sequence.add("stop"); this.bmwBuilder.setSequence(sequence); return (BMWModel) this.bmwBuilder.getCarModel(); } /** * 获得B类型的宝马车型 * @return */ public BMWModel getBBMWModel() { this.sequence.clear(); this.sequence.add("start"); this.bmwBuilder.setSequence(sequence); return (BMWModel) this.bmwBuilder.getCarModel(); } } package com.builderPattern; public class Client { public static void main(String[] args) { // TODO Auto-generated method stub Director director = new Director(); //制造100台A类型的奔驰 for(int i=0; i<1000; i++) director.getABenzModel().run(); for(int i=0; i<2000; i++) director.getBBMWModel().run(); } }
(-------------------未完待续----------------------)
标签:
原文地址:http://www.cnblogs.com/little-YTMM/p/5523668.html