设计模式之Template Method模式

 

Template Method Pattern

  • 描述:搭建一个扩展性好的框架,使来自于一个接口的方法能够呈现或满足于不同的应用实例(或场景)
  • 与之相关的设计模式:Factory Pattern,Strategy Pattern
  • 在JDK中也有template method pattern的影子,比如java.io.InputStream的子类....
      Template Method Pattern是开发过程使用率比较高的一种设计模式。因为经常会面临这样的问题,同一个功能接口,在不同的情况下,需要能够提供出不同的应用实现。比如:以一个债券类系统为例,在这个系统中存在这样的一个功能需求,要求计算出债券的每日价格。表面看上去似乎很简单,调用计算公式即可。问题并没有这么简单,在实际的债券发行市场上存在很多种不同类型的债券,各自的价格计算公式也不同。一个方法是不能满足所有债券的要求的。
     当然,解决的方法也可以是在类中增加method的方式来不断满足各种债券价格计算的需要。这样做也是正确的,无可厚非。不过,正确的不一定是可行的,随着债券种类的增加,价格计算方法的调整,结果只有一个:程序依然正确运行,代码不断混乱,维护渐入步履维艰,Bug隐藏越来越深,程序员日渐崩溃.....
    可行的解决方案是Template Method Pattern,Template Method Pattern做了两个方面的分离:
  1. 不同应用实现间的分离,而不是多交给一个类来完成,根据实现的不同由多个之类共同完成,各司其职
  2. 具体实现和外部调用的分离,提供一抽象接口,将具体实现隐藏,具体实现的变动不会影响全局

        以上面提到的债券系统每日价格计算功能为例子,在Template Method Pattern下的类图表示为:




 
             以下的代码与上图对应,能够体现Template Method Pattern的思想:
    //Business.java
             public class Business {
               public void compute(String type) {
                  Formula formula = null;
                 if(type.equals("fix"))                 
                 {
                    formula = new FixBondFormula();   
                 }else if(type.equals("float")){
                    formula = new FloatBondFormula();
                 }
                 formula.computePrice(); //computePrice方法就是所谓的模板方法(template method)
                    }
               }

              //Formula.java
             public abstract class Formula {
                    public abstract  void computePrice();
               }

               //FixBondFormula.java
               public class FixBondFormula extends Formula {
                    private void fixMethod_1() {
                        System.out.println("fix 1");
                    }
    
                    private void fixMethod_2() {
                         System.out.println("fix 2");
                    }
    
                    public void computePrice() {

                         this.fixMethod_1();
                          this.fixMethod_2();
    
                    }
                 }

               //FloatBondFormula.java
            public class FloatBondFormula extends Formula {
                    private void floatMethod_1() {
                    System.out.println("float 1");
                    }
    
                    public void computePrice() {
                         this.floatMethod_1();
                    }
               }

          Template Method Pattern是父类实现处理的骨架,把具体的留给之类来做。至于在做的过程中,该分几步,如何做都交给之类全权负责了。

          在程序设计和开发过程中,父类和子类的关系都是在不断地进行协调的,增加了父类的负担,子类的负担就减轻了,反之亦然,如何分担那又得根据实际情况来定夺了。毕竟, 归根结底设计模式强调的是一种思想,而不是要求照本宣科的使用它。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值