码迷,mamicode.com
首页 > 其他好文 > 详细

模板方法设计模式

时间:2017-10-14 18:24:38      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:父类   static   分享   gen   模板   oom   model   except   ros   

1:模板方法的定义(定义一个算法的框架将这些算法的步骤延迟到子类中,使得子类可以不改变一个算法的结构可重新定义某些特定的步骤)

2:模板方法的类图:

技术分享

2.1类图解释:通过类图我们可以看的出来模板方法其实很简单,仅仅使用了一个java的继承机制,其中abstractclass叫做抽象模板。

  基本方法:是由子类去实现的,模板方法调用基本的方法

  模板方法:可以是一个或者几个,一般是一个具体的方法,也就是一个算法的框架,实现最基本的方法的调用,完成固定的逻辑

  注意:为防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写。

2.2模板类图代码的实现

  AbstractClass:

package 基本模板方法;

public abstract class AbstractClass {
	protected abstract void doSomething();
	protected abstract void doAnything();
	protected void templateMethod(){
		/**
		 * 调用基本的方法,完成相关的逻辑
		 */
		this.doSomething();
		this.doAnything();
	}
	
}

 

  子类1:

package 基本模板方法;

public class ConcreteClass1 extends AbstractClass{

	//实现基本的方法
	@Override
	protected void doSomething() {
		// TODO Auto-generated method stub
		//业务的处理
	}

	@Override
	protected void doAnything() {
		// TODO Auto-generated method stub
		//业务的处理
	}

}

  子类2:

package 基本模板方法;

public class ConcreteClass2 extends AbstractClass{

	//实现基本方法
	@Override
	protected void doSomething() {
		// TODO Auto-generated method stub
		//处理业务逻辑
	}

	@Override
	protected void doAnything() {
		// TODO Auto-generated method stub
		//处理业务逻辑
	}

	
	
}

  运行类:

package 基本模板方法;

public class Client {

	public static void main(String[] args) {
		AbstractClass abstractClass1 = new ConcreteClass1();
		AbstractClass abstractClass2 = new ConcreteClass2();
		//调用模板的方法
		abstractClass1.templateMethod();
		abstractClass2.templateMethod();
		
	}
	
}

3:模板方法的应用  

  3.1模板方法的有点

    a.封装不变部门,扩展可变部分

    b.提取公共组成部分

    c.行为由父类控制,子类实现

4:模板方法扩展实例

  

package 模板方法模式;

public abstract class HummerModel {

	public abstract void start();
	public abstract void stop();
	public abstract void alarm();
	public abstract void engineBoom();
	
	final public void run() {
		//先启动
				this.start();
				//引擎发声
				this.engineBoom();
				//鸣笛
				if (isAlarm()) {
					this.alarm();
				}
				
				this.stop();
	}
	
	//钩子函数
	protected boolean isAlarm(){
		return true;
	}
	
}

package 模板方法模式;

public class HummerH1Model extends HummerModel{

	private boolean alarmFlag = true;//要喇叭
	
	@Override
	public void start() {
		System.out.println("H1启动");
	}

	@Override
	public void stop() {
		System.out.println("H1停车");
	}

	@Override
	public void alarm() {
		System.out.println("H1鸣笛");
	}

	@Override
	public void engineBoom() {
		System.out.println("H1引擎轰鸣声");
	}

	protected boolean isAlarm(){
		return this.alarmFlag;
	}
	
	//要不要响喇叭,是有客户控制的
	public void setAlarm(boolean isAlarm){
		this.alarmFlag = isAlarm;
	}
	
	

}


package 模板方法模式;

public class HummerH2Model extends HummerModel{

	@Override
	public void start() {
		System.out.println("H2启动");
		
	}

	@Override
	public void stop() {

		System.out.println("H2停车");
	}

	@Override
	public void alarm() {

		System.out.println("H2鸣笛");
		
	}

	@Override
	public void engineBoom() {

		System.out.println("H2引擎发声");
		
	}

	
	//默认没有喇叭的
	public boolean isAlarm(){
		return false;
	}
	

}

package 模板方法模式;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Client {

	public static void main(String[] args) throws IOException {
		System.out.println("-----H1-----");
		String type = (new BufferedReader(new InputStreamReader(System.in))).readLine();
		HummerH1Model h1 = new HummerH1Model();
		if (type.equals("0")) {
			h1.setAlarm(false);
		}
		h1.run();
		System.out.println("-----H2-----");
		HummerH2Model h2 = new HummerH2Model();
		h2.run();
	}
	
}

  

  

 

模板方法设计模式

标签:父类   static   分享   gen   模板   oom   model   except   ros   

原文地址:http://www.cnblogs.com/airycode/p/7667663.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!