模板方法模式

个人笔记,请不要被误导

模板方法模式:在一个方法中定义一个方法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。


不同子类的相同方法在抽象父类里声明为final,防止子类修改。不同子类的不同方法在抽象父类声明为abstract,让子类去实现。还有一种子类可以选择实现或不实现,父类中既不声明abstract,也不声明final,父类给一个默认的函数,子类可以改写,称为“钩子”。

java API里的数组类的sort方法(它是一个静态方法)用组合(因为无法设计一个类继承java数组)的方式实现模板方法模式。sort()调用的mergeSort()是真正排序的算法。mergeSort()里只能对Comparable的对象进行排序。Comparable是个接口。假如想对节点排序(根据节点的值),就需要节点类实现Comparable接口,重写CompareTo()方法。


和其它模式的关系:

工厂模式是模板方法模式中的一种特殊版本。

策略模式是定义一个算法族,让这些算法可以替换。算法都被封装起来,客户可以轻易使用不同算法或者改变。

模板方法模式是定义一个算法大纲,而由子类定义其中某些步骤的内容。这样子类可以有不同的实现细节,但是算法结构不变。

public abstract class CaffeineBeverage {
    public final void prepareRecipe(){
        boilWater();
        pourInCup();
        if (customerWantsCondimentsHook()) addCondiments();//如果钩中了,就调用相应方法
    }
    public abstract void brew();//子类不同的方法设置为抽象,由子类实现
    public abstract void addCondiments();
    public final void boilWater(){};
    public final void pourInCup(){};
    public boolean customerWantsCondimentsHook(){return true;};//钩子可以让子类有能力对算法不同点进行挂钩
}
public class Tea extends CaffeineBeverage { @Override public void brew() { System.out.print("brew tea"); } @Override public void addCondiments() { System.out.print("add lemon"); }}public class Coffee extends CaffeineBeverage { @Override public void brew() { System.out.print("Brew coffee"); } @Override public void addCondiments() { System.out.print("add suger"); }}public void TemplateMethodPattern(){ Tea tea = new Tea(); tea.prepareRecipe(); }

Collections.sort(intervals, new Comparator<Interval>() {
            @Override
            public int compare(Interval o1, Interval o2) {
                return o1.start - o2.start;
            }
        });


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值