zoukankan      html  css  js  c++  java
  • 模板方法设计模式

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

      

      

  • 相关阅读:
    Oracle 查看表空间的大小及使用情况sql语句
    Oracle审计--AUD$占用空间较大处理方案
    system表空间爆满解决方法
    Oracle查询库中记录数大于2千万的所有表
    oracle 百万行数据优化查询
    React (Native) Rendering Lifecycle
    React于React native的渲染机制
    Virtual DOM的渲染机制--猜测
    react的优点:兼容了dsl语法与UI的组件化管理
    What is Babel?---JSX and React
  • 原文地址:https://www.cnblogs.com/airycode/p/7667663.html
Copyright © 2011-2022 走看看