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

    一 什么是模板模式

      模板模式是在一个抽象类中定义了执行它的方法的方式(模板方法),由抽象类的子类根据具体的业务需求去重写父类的中方法,但执行时将调用抽象类中定义的方式进行。

    二 模板模式原理分析

      在模板模式中,我们需要2个类,如下图

      1 抽象的父类:在父类中,我们定义模板方法;

      2具体的实现的子类:在子类中,重写父类中定义的模板方法,不同的子类,可以按照各自不同的业务逻辑去实现,以供调用

    三 模板模式举例实现

      举个例子,用代码简单的实现模板模式

      在我们的项目中有一个支付的业务场景(医院信息化系统)。患者在做检查前需要先去缴费(支付),缴费后会收到打印的缴费单,拿到缴费单之后再去做检查。目前系统中支持的缴费方式有3种(支付宝、微信、现金)

    首先,我们将支付相关方法提取出来,定义抽象类模板方法,pay方法是我们的骨架方法,具体由其他方法完成,

     1 public abstract class AbstractPayment {
     2 
     3     public void pay() {
     4         //支付前
     5         beforePay();
     6         //实现支付
     7         doPay();
     8         //支付后
     9         afterPay();
    10     }
    11 
    12     public void beforePay(){
    13     }
    14 
    15     public void doPay(){
    16     }
    17 
    18     public void afterPay(){
    19     }
    20 }

    其次,根据支付方式,完成对应的实现(支付类继承并重写父类方法)

    1 支付宝支付类

     1 public class AliPay extends AbstractPayment {
     2 
     3     @Override
     4     public void beforePay() {
     5         System.out.println("支付宝支付------支付前数据组装");
     6     }
     7 
     8     @Override
     9     public void doPay() {
    10         System.out.println("调用支付宝支付API------完成支付");
    11     }
    12 
    13     @Override
    14     public void afterPay() {
    15         System.out.println("支付宝支付------支付后打印缴费单");
    16     }
    17 }

    2 微信支付类

     1 public class WxPay extends AbstractPayment {
     2 
     3     @Override
     4     public void beforePay() {
     5         System.out.println("微信支付------支付前数据组装");
     6     }
     7 
     8     @Override
     9     public void doPay() {
    10         System.out.println("调用微信支付API------完成支付");
    11     }
    12 
    13     @Override
    14     public void afterPay() {
    15         System.out.println("微信支付------支付后打印缴费单");
    16     }
    17 }

    3 现金支付类

     1 public class CashPay extends AbstractPayment {
     2 
     3     @Override
     4     public void beforePay() {
     5         System.out.println("现金支付------支付前金额确认");
     6     }
     7 
     8     @Override
     9     public void doPay() {
    10         System.out.println("现金支付------完成支付");
    11     }
    12 
    13     @Override
    14     public void afterPay() {
    15         System.out.println("现金支付------支付后打印缴费单");
    16     }
    17 }

    四 测试

      上边简单的模拟实现了模板模式,抽象类的子类根据各自业务逻辑分别重写了beforePay,doPay,afterPay方法。我们写个main方法做个测试

     1 public static void main(String[] args) {
     2      
     3         AliPay aliPay = new AliPay();
     4         aliPay.pay();
     5     
     6         WxPay wxPay = new WxPay();
     7         wxPay.pay();
     8 
     9         CashPay cashPay = new CashPay();
    10         cashPay.pay();
    11 
    12     }

    控制台输出结果如下

    上边这个例子中,我们把不变的方法pay交给抽象父类管理,可变的方法beforePay,doPay,afterPay交给子类做扩展实现,代码看起来很统一,出现问题时也很容易定位问题。但也存在一个类似静态代理的缺点,就是如果我们有很多种支付方式时,我们就需要写很多个支付子类去继承抽象类,进而导致很多的对象类文件,系统也会变得很庞大。

  • 相关阅读:
    第八章 Python 对象和类
    第七章 Python 盒子:模块、包和程序
    第六章 Python 函数(二)
    第五章 Python 函数(一)
    VS的32位、64位预处理定义;
    python 3D散点绘图;
    基于生长的棋盘格角点检测算法解读
    C++11: std::function<void()> func;
    有关pyinstaller打包程序后,转到其他电脑报“Failed to excute script"的问题;
    Qt: 监听文件夹QFileSystemWatcher;
  • 原文地址:https://www.cnblogs.com/love-wzy/p/10226556.html
Copyright © 2011-2022 走看看