zoukankan      html  css  js  c++  java
  • 框架设计读书笔记--扩展点设计--钩子方法

    创建扩展点的方法有(1)继承法, (2)组合法

    先看继承法: 分别是钩子方法, 和模板方法

    钩子方法是一个占位符,可以是一个抽象类中的抽象方法,或者是一个类,一个应用程序。

    举例说明钩子方法,也就是抽象方法是如何工作的

        public abstract class BasicBusiness

        {

            protected float income;

            //the template method

            public void ReportTax()

            {

                float sTax = CalculateStateTax();

                float fTax = CalculateFedTax();

                bool ok = CheckBankBalance(sTax + fTax);

                if (!ok)

                {

                    FileBankruptcy();

                }

                else

                {

                    SendMoneyToGov(sTax + fTax);

                }

            }

            protected abstract float CalculateStateTax();

            protected abstract float CalculateFedTax();

        }

    BasicBusiness 类是一个抽象类,包含三个方法, ReportTax, CalculateStateTax, CalculateFedTax, 其中后两个方法是抽象方法, BasicBusiness类用于向州和联邦政府报告所得税, 它包含了虚构的税务申报的领域知识,如果账户金额足够,将给政府一张支票,否则,账户持有人将申请破产。

    ReportTax 方法依靠两项信息来决定是缴税还是申报破产, 缴纳给州政府的税款总额和缴纳给联邦政府的税款总额。 税法决定了如何计算税款总额。 例如,根据交易地点和类型不同,将使用不同的税级, BasicBusiness组件并不知道碎发信息。 BasicBusiness类也不知道如何计算税款总额,而是把这个任务交给知道如何计算的类执行,, 两个抽象方法扮演了占位符的角色, 他们以后会被天上计算税款总额的代码,正如你在上面例子中看到的一样, CheckBackBalance方法使用这两个抽象方法的返回值作为参数,尽管这两个抽象方法还没有被实现。

    必须要有代码实现这两个抽象方法, 否则ReportTax方法就不能提供有意义的功能,因为BasicBusiness包含抽象方法,直接实例化它是不被允许的,你需要创建一个派生自它的具体类,并实现它的两个抽象方法,下面的例子就是一个实现类。

        public class NewYorkBusiness :BasicBusiness

        {

            protected override float CalculateStateTax()

            {

                return income*0.1F;

            }

            protected override float CalculateFedTax()

            {

                return income*0.2F;

            }

        }

    NewYorkBusiness是一个具体类,它为纽约州提供了税款的计算方法。 有了NewYorkBusiness类中的客户化实现,BasicBusiness类中定义的ReportTax方法就能够执行有意义的行为了,如下例中所示;

                BasicBusiness nyBusiness = new NewYorkBusiness();

                nyBusiness.ReportTax();

                BasicBusiness caBusiness = new CaliforniaBusiness();

                caBusiness.ReportTax();

    抽象方法对应用开发和框架开发都是非常重要的概念, 假设BasicBusiness 类是框架组件,而NewYorkBusiness类是应用组件,BasicBusiness类为应用留下了待填充的扩展点( CalculateStateTax 和CalculateFedTax两个方法),每个应用都可以根据自己的特定需要,来填充这些扩展点。

  • 相关阅读:
    出售几个闲置的玉米
    竞价账户时好时坏怎样分析找到原因?
    两行代码轻松搞定网页自动刷新,简单,实用。
    BCompare文件对比神器 工程师 开发必备工具之一
    关于 Apache 屏蔽 IP 地址
    一段 JavaScript 实现禁止用户打开控制台与鼠标右键查看源码
    Apache使用.htaccess防盗链禁止用户下载
    HTML5下video右键禁用-禁止右键下载视频
    python装饰器
    部署nginx支持lua
  • 原文地址:https://www.cnblogs.com/grkin/p/3214596.html
Copyright © 2011-2022 走看看