Template Method模式与Strategy模式的理解

 Template Method模式在运用中把工作流程在抽象超类中实现,并把一些功能交给子类来具体实现,调用者不用关心具体实现是什么样子的,而且也不应该知道具体实现。

 

/**
 * Template Method模式
 * 超类集中业务逻辑,而子类集中于实现基本超作
 * 
@author paul
 * @date 2006-8-9
 
*/

public   abstract   class  CaffeineBeverage  {
    
/**
     * 业务逻辑流程,final确保不被子类 改变
     * prepareRecipe void
     * 2006-8-9 16:00:57
     
*/

    
final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    
/**
     * 模板方法,有子类集体实现
     * 受保护的方法,调用者不用关心实现的细节
     * brew void
     * 2006-8-9 16:02:17
     
*/

    
protected abstract void brew();
  
    
abstract void addCondiments();
 
    
void boilWater() {
        System.out.println(
"Boiling water");
    }

  
    
void pourInCup() {
        System.out.println(
"Pouring into cup");
    }

}


public   class  Coffee  extends  CaffeineBeverage  {
    
public void brew() {
        System.out.println(
"Dripping Coffee through filter");
    }

    
public void addCondiments() {
        System.out.println(
"Adding Sugar and Milk");
    }

}

public   class  Tea  extends  CaffeineBeverage  {
    
public void brew() {
        System.out.println(
"Steeping the tea");
    }

    
public void addCondiments() {
        System.out.println(
"Adding Lemon");
    }

}

Strategy设计模式在运用中可以替代Template Method模式,替代的目的为了获得更大的扩展性和自由度。

 

/**
 * Strategu模式,把公用方法抽象成接口
 * 
@author  paul
 * @date 2006-8-9
 
*/
public   abstract   class  Beverage {
    
/**
     * 业务逻辑的实现,final确保不被子类 改变
     * prepareRecipe void
     * 2006-8-9 16:00:57
     
*/
    
final   void  prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }
    
private  ActionInDrinking action;
    
public   void  brew() {
        action.brew();
        
    }
    
public   void  addCondiments(){
        
this .action.addCondiments();
    }
    
// protected abstract void brew();
    
// abstract void addCondiments();
 
    
void  boilWater() {
        System.out.println(
" Boiling water " );
    }
  
    
void  pourInCup() {
        System.out.println(
" Pouring into cup " );
    }

    
public  ActionInDrinking getAction() {
        
return  action;
    }

    
public   void  setAction(ActionInDrinking action) {
        
this .action  =  action;
    }
}
/
public   interface  ActionInDrinking {
  
public   void  brew();
  
public   void  addCondiments();

}
public   class  TeaDrink  implements  ActionInDrinking {

    
public  TeaDrink() {
        
super ();
        
//  TODO Auto-generated constructor stub
    }

    
public   void  brew() {
        
//  TODO Auto-generated method stub
        
//  steeping tea
    }

    
public   void  addCondiments() {
        
//  TODO Auto-generated method stub
        
    }

}
这样的设计在框架或工具设计中是更加合理的。以上例子为了展示,不是实际使用的东西。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值