zoukankan      html  css  js  c++  java
  • 设计模式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();
    	}
    	
    }
    

      

  • 相关阅读:
    uni.navigateTo 无法跳转到页面
    微信小程序 navigateTo 只能使用几次 无效后 怎么处理的?
    Vue中computed和watch的区别
    vue 动态添加样式的方式
    浏览器数据库IndexedDB介绍
    Gitlab CI/CD 之 Gitlab Runner Docker Executor 缓存问题
    Gitlab CI/CD 之 Gitlab-Runner
    .neter 的 java 学习之路
    Gitlab 迁移后 runner 访问报错的问题
    .neter 的 java 学习之路
  • 原文地址:https://www.cnblogs.com/zcy-backend/p/6681394.html
Copyright © 2011-2022 走看看