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

    模板方法模式(TemplateMethod)定义:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。

    模板方法模式的优点有:

    1、它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。

    2、它在父类中提取了公共的部分代码,便于代码复用。

    3、部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。

    抽象类(父类):

     1 public abstract class AbstractClass {
     2     //已知<执行顺序>
     3     public void TemplateMethod() {
     4         SpecificMethod();
     5         abstractMethod1();
     6         abstractMethod2();
     7     }
     8 
     9     //已知的<具体实现>
    10     public void SpecificMethod() {
    11         System.out.println("抽象类中的方法被调用");
    12     }
    13 
    14     //未知的<具体实现>
    15     public abstract void abstractMethod1();
    16     public abstract void abstractMethod2();
    17 }

    具体类(子类):

     1 public class ConcreteClassA extends AbstractClass {
     2     @Override
     3     public void abstractMethod1() {
     4         // TODO Auto-generated method stub
     5         System.out.println("实现A中方法1被调用");
     6     }
     7 
     8     @Override
     9     public void abstractMethod2() {
    10         // TODO Auto-generated method stub
    11         System.out.println("实现A中方法2被调用");
    12     }
    13 }
    14 
    15 public class ConcreteClassB extends AbstractClass {
    16     @Override
    17     public void abstractMethod1() {
    18         // TODO Auto-generated method stub
    19         System.out.println("实现B中方法1被调用");
    20     }
    21 
    22     @Override
    23     public void abstractMethod2() {
    24         // TODO Auto-generated method stub
    25         System.out.println("实现B中方法2被调用");
    26     }
    27 }

    调用方式:

     1 public class Client {
     2     //子类继承父类,通过new出不同的子类实现不同的行为
     3     public static void main(String[] args) {
     4         /*设计一个系统时知道了算法所需的关键步骤,
     5          * 已知<执行顺序>,
     6          * 还未知<某些步骤的具体实现>,
     7          * 或者说某些步骤的实现与具体的环境相关。
     8          * */
     9         
    10         //扩展点
    11         AbstractClass abstractClass;
    12         
    13         //具体实现A
    14         abstractClass = new ConcreteClassA();
    15         //切换到具体实现B
    16         //abstractClass = new ConcreteClassB();
    17         
    18         //稳定的代码
    19         abstractClass.TemplateMethod();
    20     }
    21 }

    执行结果:

  • 相关阅读:
    vb移动窗体的代码
    vb得到一个进程的启动参数?
    UTF8方式读写文件的模块
    JavaScript中Window.event详解
    vb设置窗体不可移动
    一拖二
    实习第一天
    사랑해
    决定考研
    Eclipse快捷键
  • 原文地址:https://www.cnblogs.com/asenyang/p/12111060.html
Copyright © 2011-2022 走看看