• 设计模式7:模板方法模式


    有时候,我们需要定义某个方法,这个方法在高层次来看是相同的,但是里面几个具体步骤有可能有些不同。

    一种实现方法是父类定义一个虚方法,由多个子类具体实现。但是这样做的话,不变的和可变的行为在子类中是混合在一起的,造成代码的大量重复。

    这时候我们需要使用模板方法模式。

    模板方法模式:定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构,即可重定义算法的某些特定步骤。

    这个模式通过将不变的行为搬移到父类,去除子类中的重复代码。

    UML图:

    在父类中,templateMethod是模板方法,需要调用primitiveMethod1和primitiveMethod2两个虚方法。

    子类中对这两个虚方法给出了具体实现。

    代码:

    AbstractClass及其子类:

    public abstract class AbstractClass {
    	
    	public void templateMethod() {
    		primitiveMethod1();
    		primitiveMethod2();
    		System.out.println("templateMethod");
    	}
    
    	protected abstract void primitiveMethod1();
    
    	protected abstract void primitiveMethod2();
    }
    
    public class ConcreteClass1 extends AbstractClass {
    
    	@Override
    	protected void primitiveMethod1() {
    		System.out.println("ConcreteClass1.primitiveMethod1");
    	}
    
    	@Override
    	protected void primitiveMethod2() {
    		System.out.println("ConcreteClass1.primitiveMethod2");
    	}
    
    }
    public class ConcreteClass2 extends AbstractClass {
    
    	@Override
    	protected void primitiveMethod1() {
    		System.out.println("ConcreteClass2.primitiveMethod1");
    	}
    
    	@Override
    	protected void primitiveMethod2() {
    		System.out.println("ConcreteClass2.primitiveMethod2");
    	}
    
    }
    

    Demo:

    public class TemplateDemo {
    	
    	public static void main(String[] args) {
    		AbstractClass class1 = new ConcreteClass1();
    		class1.templateMethod();
    		AbstractClass class2 = new ConcreteClass2();
    		class2.templateMethod();
    	}
    	
    }
    

      

  • 相关阅读:
    工作中遇到的令人头疼的bug
    Cookie的简单用法
    C#之#if #endif的简单用法
    我们一起学习WCF 第十篇Wcf中实现事务
    一次性搞定Session
    设计模式-观察者模式
    类的扩展之 DataReader的扩展
    C#之Ref,Out以及TryParse()的用法
    C#之Lambda不得不说的用法
    C#之Action和Func的用法
  • 原文地址:https://www.cnblogs.com/zcy-backend/p/6681394.html
Copyright © 2020-2023  润新知