模板方法 - 行为模式

个人理解:    

模式类型:

    Template Method  模板方法 - 行为模式
    
意图:
    Define the skeleton of an algorithm in an operation, deferring some steps to subclasses.
    Template Method lets subclasses redefine certain steps of an algorithm without letting them to change the algorithm's structure.
     模板方法Gof的定义是:在一个方法里定义算法的骨架,将一些步骤延迟到其子类。

     
概述:
    AbstractClass主要是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
    模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式。
    注意:模板方法模式中,抽象类的模板方法应该声明为final的。因为子类不能覆写一个被定义为final的方法。从而保证了子类的逻辑永远由父类所控制。子类必须实现的方法定义为abstract。而普通的方法(无final或abstract修饰)则称之为钩子。
    
角色:
(1) AbstractClass(抽象类):在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。
(2) ConcreteClass(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。

模式的应用场景:


结构图:



模式的优缺点:
优点:
    1)模板方法模式在一个类中形式化地定义算法,而由它的子类实现细节的处理。
    2)模板方法是一种代码复用的基本技术。它们在类库中尤为重要,它们提取了类库中的公共行为。
    3)模板方法模式导致一种反向的控制结构,这种结构有时被称为“好莱坞法则” ,即“别找我们,,我们找你”通过一个父类调用其子类的操作(而不是相反的子类调用父类),通过对子类的扩展增加新的行为,符合“开闭原则”
缺点:
    每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,但是更加符合“单一职责原则”,使得类的内聚性得以提高。

模式的实例应用:
(1) JUnit中的TestCase以及它的子类就是一个模板方法模式的例子。在TestCase这个抽象类中将整个测试的流程设置好,比如先执行setup方法初始化测试资源,再运行测试方法,然后再tearDown来释放测试资源。但是我们将在setup、tearDown里面作些什么?谁知道呢?!因此,这些步骤的具体实现都会延迟到子类中去,也就是我们实现的测试类中。
(2) Struts框架控制器的核心类RequestProcess里面的process方法也是采用了经典的模板方法模式,里面定义好了流程的步骤,而步骤里面的很多环节,我们都是可以重写的。
(3)Spring用另一种方式实现了Template Method模式,我们来详细解读一下。Spring对Hibernate的调用提供了HibernateDaoSupport的支持,在该类中,有了一个HibernateTemplate类来调用Hiebarnate接口,通过另外一种方式使用Template Method模式,避免了开发者代码中出现诸如Session管理、事务控制等重复代码。
    
代码(其实读UML图要比代码还要一目了然):
    /** 
     * 模板方法中的父类,prepare方法定义了算法步骤,不同的饮料需要实现不同的brew,并可以选择是否覆盖food方法 
     *  
     * @author sky 
     *  
     */  
    public abstract class Beverage {  
      
        /** 
         * 准备饮料的过程,烧水,冲泡,倒杯,搭配糕点 
         */  
        final public void prepare() {  
            boilWater();  
            brew();  
            pourInCup();  
            food();  
        }  
      
        final public void boilWater() {  
            System.out.println("烧水");  
        }  
      
        abstract void brew();  
      
        final public void pourInCup() {  
            System.out.println("将饮料倒入杯子里");  
        }  
      
        public void food() {  
            System.out.println("搭配一点糕点");  
        }  
      
    }  
      
    /** 
     * 咖啡,实现了brew方法 
     *  
     * @author sky 
     *  
     */  
    public class Coffee extends Beverage {  
      
        @Override  
        void brew() {  
            System.out.println("冲咖啡");  
        }  
      
    }  
      
    /** 
     * 茶,实现了brew方法,重写了food方法 
     *  
     * @author sky 
     *  
     */  
    public class Tea extends Beverage {  
      
        @Override  
        public void food() {  
            System.out.println("喝茶不需要搭配糕点");  
        }  
      
        @Override  
        void brew() {  
            System.out.println("冲茶");  
        }  
      
    }  
      
    /** 
     * 测试类 
     *  
     * @author sky 
     *  
     */  
    public class Test {  
      
        public static void main(String[] args) {  
            System.out.println("---茶---");  
            Beverage tea = new Tea();  
            tea.prepare();  
            System.out.println("---咖啡---");  
            Beverage coffee = new Coffee();  
            coffee.prepare();  
        }  
      
    }  
      
    输出:  
        ---茶---  
        烧水  
        冲茶  
        将饮料倒入杯子里  
        喝茶不需要搭配糕点  
        ---咖啡---  
        烧水  
        冲咖啡  
        将饮料倒入杯子里  
        搭配一点糕点  


所有模式:
     创建型模式,共五种:工厂方法模式、抽象工厂模式单例模式建造者模式原型模式
结构型模式,共七种:适配器模式装饰器模式代理模式外观模式桥接模式组合模式享元模式
    行为型模式,共十一种:策略模式模板方法模式观察者模式迭代子模式责任链模式命令模式备忘录模式状态模式访问者模式中介者模式解释器模式
    补充模式:空对象模式

参考/转自:

http://blog.csdn.net/lenotang/article/details/2911246
http://www.oodesign.com/template-method-pattern.html
http://blog.csdn.net/lovelion/article/details/8299794


转载请注明:http://blog.csdn.net/paincupid/article/details/46900891

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值