zoukankan      html  css  js  c++  java
  • (六)模板方法模式

    1. 定义

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

    TemplateMethod

    既然使用了继承,并且肯定这个继承是有意义的,就应该要成为子类的模板,所有重复的代码都应该上升到父类去,而不是让每个子类都去重复。
    当我们要完成某一细节层次一致的一个过程或一系列步骤,但某个别步骤在实现上可能不同是,通常考虑用模板方法模式来处理。

    2. 模板方法模式优点

    模板方法模式是通过把不变的行为搬移到超类, 去除子类中的重复代码来体现它的优势。

    模板方法模式就是提供了一个很多好的代码复用平台。

    当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠.

    3. 实例

    /** 模板方法模式 */
    
    #include <iostream>
    using namespace std;
    
    /*
    实现了一个模板方法, 定义了算法的骨架,
    具体子类将重定义PrimitiveOperation以
    实现一个算法的步骤.
    */
    class AbstractClass
    {
    public:
        void TemplateMethod()
        {
            cout<<"do something ..."<<endl;
            PrimitiveOperation1();
            cout<<"do something else ..."<<endl;
            PrimitiveOperation2();
            cout<<"do something last ..."<<endl;
        }
    
    private:
        virtual void PrimitiveOperation1() = 0;
        virtual void PrimitiveOperation2() = 0;
    };
    
    
    /*
    实现了PrimitiveOperation
    以完成算法中与特定子类相关的步骤.
    */
    class ConcreteClassA : public AbstractClass
    {
    private:
        void PrimitiveOperation1() override
        {
            cout<<"具体类A方法1实现."<<endl;
        }
    
        void PrimitiveOperation2() override
        {
            cout<<"具体类A方法2实现."<<endl;
        }
    };
    
    class ConcreteClassB : public AbstractClass
    {
    private:
        void PrimitiveOperation1() override
        {
            cout<<"具体类B方法1实现."<<endl;
        }
    
        void PrimitiveOperation2() override
        {
            cout<<"具体类B方法2实现."<<endl;
        }
    };
    
    /*
    模板方法模式是通过把不变的行为搬移到超类, 去除子类中的重复代码来体现它的优势.
    模板方法模式就是提供了一个很多好的代码复用平台.
    当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现.
    我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠.
    */
    /* 测试 */
    int main()
    {
        AbstractClass *p=new ConcreteClassA();
        p->TemplateMethod();
    
        AbstractClass *q=new ConcreteClassB();
        q->TemplateMethod();
    
        return 0;
    }
    
  • 相关阅读:
    小素典会员订阅协议
    vue项目自动构建工具1.0,支持多页面构建
    spring boot 框架根據 sql 創建語句自動生成 MVC層類代碼
    使用 docsify 創建自己的 markdown 文檔系統
    “衣”及其部分屬字
    js原型鏈與js繼承解析
    js 中怎么获取session 值和HTML标签的属性值
    layui table动态表头 改变表格头部 重新加载表格的方法
    throw throws Throwable 关联于区别
    静态代理和动态代理的区别和联系
  • 原文地址:https://www.cnblogs.com/walkinginthesun/p/9511171.html
Copyright © 2011-2022 走看看