模板方法设计模式

Posted airycode

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板方法设计模式相关的知识,希望对你有一定的参考价值。

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();
	}
	
}

  

  

 

以上是关于模板方法设计模式的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段1——vue主模板

VSCode自定义代码片段2——.vue文件的模板

VSCode自定义代码片段(vue主模板)

VS Code配置snippets代码片段快速生成html模板,提高前端编写效率

Eclipse 中的通用代码片段或模板