设计模式----模板方法模式

一、什么是模板方法模式

  模板方法在抽象类的一个方法中定义一个算法的骨架,将具体的算法实现放在子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

二、什么时候该使用钩子方法?

  当你的子类“必须”提供算法中某个方法或步骤的实现时,就用抽象方法。如果算法的这个部分是可选的,就用钩子。钩子方法可以让子类控制算法结构。

三、好莱坞原则的作用

  避免让高层和低层组件之间有明显的环状依赖。将决策权放在高层模块中,以便决定如何以及何时调用低层模块。

四、模板、策略和工厂方法模式的区别

模板方法--子类决定如何实现算法中的某些步骤;

策略模式---封装可互换的行为,然后使用委托来决定要采用哪一个行为;

工厂方法---由子类决定实例化哪个具体类;

策略模式和模板方法模式都封装算法,一个用组合,一个用继承。工厂方法是模板方法的一种特殊版本。

五、模板方法模式的代码实现

 

package modelMethod;

public class Test {
    public static void main(String[] args) {
        Coffee coffee = new Coffee();
        coffee.process();
        System.out.println("-------------------");
        Tea tea = new Tea();
        tea.process();
    }
    
}

 

package modelMethod;
/**
 * 冲泡抽象模板类
 * @author lenovo
 *
 */
public abstract class ChongPao {
    abstract void boilWater();
    abstract void brew();
    abstract void pourInCup();
    abstract void addCondiments();
    boolean hoke(){ 
        return true;
    }
    
    void process(){
        boilWater();
        brew();
        pourInCup();
        if(hoke()){
            addCondiments();
        }
    }
}

 

package modelMethod;

public class Coffee extends ChongPao{

    @Override
    void boilWater() {
        System.out.println("咖啡烧水");
    }

    @Override
    void brew() {
        System.out.println("放咖啡");
        
    }

    @Override
    void pourInCup() {
        System.out.println("往咖啡杯倒开水");
        
    }

    @Override
    void addCondiments() {
        System.out.println("咖啡加糖");
        
    }
    
    public boolean hoke(){
        System.out.println("泡咖啡默认加糖,冲泡完成");
        return false;
    }

}
package modelMethod;

public class Tea extends ChongPao{

    @Override
    void boilWater() {
        System.out.println("泡茶烧水");
        
    }

    @Override
    void brew() {
        System.out.println("放茶叶");
        
    }

    @Override
    void pourInCup() {
        System.out.println("往茶杯倒开水");
        
    }

    @Override
    void addCondiments() {
        System.out.println("往茶杯加糖");
        
    }
    
    public boolean hoke(){
        System.out.println("泡茶默认不加糖,冲泡完成");
        return false;
    }

}

 

运行结果:

 

posted @ 2017-02-23 09:58  喵喵2023  Views(235)  Comments(0Edit  收藏  举报