书城计算机大话设计模式
11030400000155

第155章 7 模板方法模式与开闭原则

小A:“什么是‘开闭原则’?”

大B:“是指一个软件实体应该对扩展开放,对修改关闭。也就是说软件实体必须是在不被修改的情况下被扩展。模板方法模式意图是由抽象父类控制顶级逻辑,并把基本操作的实现推迟到子类去实现,这是通过继承的手段来达到对象的复用,同时也遵守了开闭原则。父类通过顶级逻辑,它通过定义并提供一个具体方法来实现,也称之为模板方法。通常这个模板方法才是外部对象最关心的方法。在前面的订单处理例子中,public Order placeOrder(int customerId,List orderItemList)这个方法才是外部对象最关心的方法。所以它必须是public的,才能被外部对象所调用。子类需要继承父类去扩展父类的基本方法,但是它也可以覆写父类的方法。如果子类去覆写了父类的模板方法,从而改变了父类控制的顶级逻辑。这违反了‘开闭原则’。我们在使用模板方法模式时,应该总是保证子类有正确的逻辑。所以模板方法应该定义为final的。所以AbstractOrder 类的模板方法placeOrder方法应该定义为final。”

代码:

public final Order placeOrder(int customerId,List orderItemList)

rendercode();

大B:“因为子类不能覆写一个被定义为final的方法。从而保证了子类的逻辑永远由父类所控制。模板方法模式中,抽象类的模板方法应该声明为final的。”