框架设计读书笔记--扩展点设计--钩子方法

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

posted @ 2013-07-25 16:20  grkin  阅读(1149)  评论(0编辑  收藏  举报