设计模式(2)---模板方法模式
模板方法模式 Template Method(行为型模式)
1.概述
在软件开发中,有时也会遇到类似的情况,某个方法的实现需要多个步骤,其中有些步骤是固定的(类似“点单”和“买单”),而有些步骤并不固定,存在可变性(类似“吃东西”)。为了提高代码的复用性和系统的灵活性,可以使用一种称之为模板方法模式的设计模式来对这类情况进行设计,在模板方法模式中,将实现功能的每一个步骤所对应的方法称为基本方法(例如“点单”、“吃东西”和“买单”),而调用这些基本方法同时定义基本方法的执行次序的方法称为模板方法。在模板方法模式中,可以将相同的代码放在父类中,例如将“点单”和“买单”的实现放在父类中,而对于基本方法“吃东西”,在父类中只做一个声明,将其具体实现放在不同的子类中,在一个子类中提供“吃面条”的实现,而另一个子类提供“吃饭”的实现。通过使用模板方法模式,一方面提高了代码的复用性,另一方面还可以利用面向对象的多态性,在运行时选择一种具体子类,实现完整的“请客”方法,提高系统的灵活性和可扩展性
2.定义
模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
3.结构图
4.例子
1 public abstract class AbstractTemplate { 2 3 protected final void beforeAction(){ 4 System.out.println("点单"); 5 } 6 7 protected abstract void executeMain(); 8 9 protected final void afterAction(){ 10 System.out.println("买单"); 11 } 12 13 public void execute(){ 14 beforeAction(); 15 executeMain(); 16 afterAction(); 17 } 18 19 }
1 public class ConcreteA extends AbstractTemplate{ 2 3 @Override 4 protected void executeMain() { 5 System.out.println("吃面条"); 6 } 7 8 }
1 public class ConcreteB extends AbstractTemplate{ 2 3 @Override 4 protected void executeMain() { 5 System.out.println("吃饭"); 6 } 7 8 }
1 public class Test { 2 3 public static void main(String[] args) { 4 AbstractTemplate abstractTemplate = new ConcreteB(); 5 abstractTemplate.execute(); 6 7 abstractTemplate = new ConcreteA(); 8 abstractTemplate.execute(); 9 10 } 11 12 }
5.优点
(1)模板方法模式通过把不变的行为搬移到父类,去除了子类中的重复代码。
(2)子类实现算法的某些细节,有助于算法的扩展。
(3) 通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
6.缺点
(1)每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。