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

    模板方法属于行为型设计模式,在父类中定义处理流程的框架,在子类中实现具体的处理

    推荐访问我的个人网站,排版更好看呦:
    https://chenmingyu.top/design-template-method/

    什么是模板方法

    在父类(抽象类)中定义好算法的流程,提供抽象方法,针对不同的实现交由不同的子类去实现,通过这种方式将公共代码提取出来封装在父类中,然后父类去控制行为,子类负责实现,这样当有很多子类的时候,如果要修改算法,只需要在父类中更改算法的行为即可。

    实现

    已支付为例,涉及AbstractPay,BankCardPay,WeChatPay三个类。

    AbstractPay

    抽象类(父类),定义了三个抽象方法和一个控制支付流程的方法,也就是模板方法,这个方法使用final修饰,防止被重写

    /**
     * @auther: chenmingyu
     * @date: 2019/2/13 16:58
     * @description: 抽象类,定义支付流程
     */
    public abstract class AbstractPay {
    
        /**
         * 获取支付信息
         */
        abstract String getPayInfo();
    
        /**
         * 执行支付
         */
        abstract void executePay();
    
        /**
         * 支付反馈信息
         */
        abstract void payMessage();
    
        /**
         * 支付
         */
        public final void pay(){
            String info = getPayInfo();
            System.out.println("支付账户:"+info);
            executePay();
            payMessage();
        }
    }
    
    BankCardPay

    子类实现,提供银行卡支付,继承AbstractPay类重写三个抽象方法,提供银行卡支付的实现

    /**
     * @auther: chenmingyu
     * @date: 2019/2/13 17:18
     * @description: 银行卡支付
     */
    public class BankCardPay extends AbstractPay{
    
        @Override
        String getPayInfo() {
            return "我的银行卡信息";
        }
    
        @Override
        void executePay() {
            System.out.println("银行卡支付了");
        }
    
        @Override
        void payMessage() {
            System.out.println("银行卡方式支付,发短息");
        }
    }
    
    WeChatPay

    子类实现,提供微信支付,继承AbstractPay类重写三个抽象方法,提供微信支付的实现

    /**
     * @auther: chenmingyu
     * @date: 2019/2/13 17:20
     * @description: 微信支付
     */
    public class WeChatPay extends AbstractPay{
    
        @Override
        String getPayInfo() {
            return "我的微信支付信息";
        }
    
        @Override
        void executePay() {
            System.out.println("微信支付了");
        }
    
        @Override
        void payMessage() {
            System.out.println("微信方式支付,微信内发服务通知");
        }
    }
    
    测试
    public static void main(String[] args) {
        BankCardPay bankCardPay = new BankCardPay();
        bankCardPay.pay();
        System.out.println("... 分割线 ...");
        WeChatPay weChatPay = new WeChatPay();
        weChatPay.pay();
    }
    

    输出

    支付账户:我的银行卡信息
    银行卡支付了
    银行卡方式支付,发短息
    ... 分割线 ...
    支付账户:我的微信支付信息
    微信支付了
    微信方式支付,微信内发服务通知
    

    总结一下,就是抽象类封装了一个final类型的方法,方法中调用其他的抽象方法,制定业务流程,提供的抽象方法交由子类去实现。当你有多个子类实现逻辑相同时,建议使用模板方法。

  • 相关阅读:
    算法视频库下载常用网址(转载)
    Python study 1
    $X-Real-Ip和$X-Forwarded-For的区别
    python装饰器
    python迭代器和生成器
    python函数动态参数详解
    python常用模块
    python 正则re模块
    pycharm5新版注册
    老男孩python自动化运维作业2
  • 原文地址:https://www.cnblogs.com/cmyxn/p/10382896.html
Copyright © 2011-2022 走看看