四。 模板方法模式
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.
它包含一个抽象模板和一些具体的模板。
抽象模板中包含两类方法:
- 基本方法
- 也叫基本操作,是有抽象模板给出抽象接口,子类给出实现的方法,并且这些方法会在模板方法中被调用;
- 基本方法尽量设计为protected类型,符合迪米特法则
- 模板方法
- 可以有一个或几个,一般是一个具体方法,实现对基本方法的调度,完成固定的逻辑。
- 为了防止恶意的操作,,一般模板方法都会加上final关键字,不允许被覆写。
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个角色:
- 产品类(实际就是上面的第四种模板方法模式的实现)
- 通常是实现了模板方法模式,也就是有模板方法和基本方法;
- 抽象建造者Builder
- 规范产品的组建,一般由子类实现。
- 具体构建着ConcreteBuilder
- 实现抽象建造者的所有方法,并且返回一个组建好的对象。
- 导演类
- 负责根据客户的需要安排已有模块的顺序,然后告诉Builder开始建造,然后获得ConcreteBuilder返回的对象,最后呈现给客户
所以说,不论是经由模板模式构建的产品类还是抽象或具体的建造者,对于客户都是屏蔽的,客户只需要将他的具体需求告诉导演类,最终由导演类统筹安排,将结果返回给客户。
建造者模式的使用场景有:
- 如果需求是:相同的方法,不同的执行顺序,产生不同的事件结果时,可以考虑使用。
- 一个对象由多个零件或部件构成,,但是运行产生的结果又不相同;
- 所以,,建造者模式关注的是零件类型和装配顺序不同!!!这是他与工厂方法最大的不同!!
- 工厂模式的重点则是创建,创建零件的它的主要职责,组装顺序是它不care的!!
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(); } }
(-------------------未完待续----------------------)
时间: 2024-10-15 12:43:58