美文网首页
模板方法模式

模板方法模式

作者: Teemo_fca4 | 来源:发表于2020-05-07 21:08 被阅读0次

模板方法模式:在一个抽象类中公开定义了执行方法的模板,子类按需重写子方法实现,但是调用将以抽象类定义的方式进行。


image.png

钩子方法
在模板父类中,定义一个方法,默认什么都不做,只返回true 或false作为标志位,子类看情况要不要重写这个方法。模板方法中调用这个标志,让这个方法达到钩子的作用。

//抽象类,表示豆浆
public abstract class SoyaMilk {

    //模板方法, make , 模板方法可以做成final , 不让子类去覆盖.
    final void make() {
        select(); 
        if(customerWantCondiments()) {
            addCondiments();
        }
        soak();
        beat();
        
    }
    
    //选材料
    void select() {
        System.out.println("第一步:选择好的新鲜黄豆  ");
    }
    
    //添加不同的配料, 抽象方法, 子类具体实现
    abstract void addCondiments();
    
    //浸泡
    void soak() {
        System.out.println("第三步, 黄豆和配料开始浸泡, 需要3小时 ");
    }
     
    void beat() {
        System.out.println("第四步:黄豆和配料放到豆浆机去打碎  ");
    }
    
    //钩子方法,决定是否需要添加配料  默认返回true
    boolean customerWantCondiments() {
        return true;
    }
}
public class RedBeanSoyaMilk extends SoyaMilk {

    @Override
    void addCondiments() {
        System.out.println(" 加入上好的红豆 ");
    }
}
public class PeanutSoyaMilk extends SoyaMilk {

    @Override
    void addCondiments() {
        System.out.println(" 加入上好的花生 ");
    }
}
public class PureSoyaMilk extends SoyaMilk{

    @Override
    void addCondiments() {
        //空实现
    }
    
    //重写钩子方法
    @Override
    boolean customerWantCondiments() {
        return false;
    }
}

public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //制作红豆豆浆
        
        System.out.println("----制作红豆豆浆----");
        SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
        redBeanSoyaMilk.make();
        
        System.out.println("----制作花生豆浆----");
        SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
        peanutSoyaMilk.make();
        
        System.out.println("----制作纯豆浆----");
        SoyaMilk pureSoyaMilk = new PureSoyaMilk();
        pureSoyaMilk.make();
    }
}

相关文章

网友评论

      本文标题:模板方法模式

      本文链接:https://www.haomeiwen.com/subject/hduvvctx.html