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两个方法),每个应用都可以根据自己的特定需要,来填充这些扩展点。

  • 相关阅读:
    -bash: fork: Cannot allocate memory 问题的处理
    Docker top 命令
    docker常见问题修复方法
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
    What's the difference between encoding and charset?
    hexcode of é î Latin-1 Supplement
    炉石Advanced rulebook
    炉石bug反馈
    Sidecar pattern
    SQL JOIN
  • 原文地址:https://www.cnblogs.com/grkin/p/3214596.html
Copyright © 2011-2022 走看看