您的位置:首页 > 其它

设计模式——模板方法模式

2017-04-01 14:46 239 查看
1.模板方法模式

定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

2.UML类图



模板方法模式包括两种角色:

● 抽象模板:抽象模板是一个抽象类。抽象模板定义了若干个方法以表示一个算法的各个步骤,这些方法中有抽象方法也有非抽象方法,其中的抽象方法称作原语操作。重要的一点是,抽象模板中还定义了一个称作模板方法的方法,该方法不仅包含有抽象模板中表示算法步骤的方法调用,而且也可以包含有定义在抽象模板中的其他对象的方法调用,即模板方法定义了算法骨架。

● 具体模板:具体模板是抽象模板的子类,实现抽象模板中的原语操作。

通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。模板方法模式提供了一个模板方法来定义算法框架,而某些具体步骤的实现可以在其子类中完成。

3.举例

//抽象模板
public abstract class AbstractTemplate {
public abstract void primitiveOperation1();

public abstract void primitiveOperation2();

public void templateMethod() {
primitiveOperation1();
primitiveOperation2();
System.out.println("调用了所有方法");
}
}具体模板
public class ConcreteTemplate1 extends AbstractTemplate {
@Override
public void primitiveOperation1() {
System.out.println("具体模板类1方法实现1");
}

@Override
public void primitiveOperation2() {
System.out.println("具体模板类1方法实现2");
}

@Override
public void templateMethod() {
super.templateMethod();
}
}
public class ConcreteTemplate2 extends AbstractTemplate {
@Override
public void primitiveOperation1() {
System.out.println("具体模板类2方法实现1");
}

@Override
public void primitiveOperation2() {
System.out.println("具体模板类2方法实现2");
}

@Override
public void templateMethod() {
super.templateMethod();
}
}
模式使用
public class TemplateTest {
public static void main(String[] args) {
AbstractTemplate template=new ConcreteTemplate1();
template.templateMethod();
template=new ConcreteTemplate2();
template.templateMethod();
}
}


4.钩子方法

模板方法既可以包含抽象方法的调用也可以包含具体方法的调用。具体模板必须重写抽象模板中的抽象方法,但是对于抽象模板中的具体方法,具体模板可以选择直接继承或重写这个具体方法。钩子方法是抽象模板中定义的具体方法,但给出了空实现或默认的实现,如果抽象模板不希望其中的具体方法是钩子方法,就需要将该具体方法用final修饰,要求子类必须继承该具体方法,不能重写。某些钩子方法的作用是对模板方法中的某些步骤进行挂钩,以确定在什么条件下执行模板方法中的哪些算法步骤。
5.适用场景

设计者需要给出一个算法的固定步骤,并将某些步骤的具体实现留给子类来实现

需要对代码进行重构,将各个子类公共行为提取出来集中到一个共同的父类中以避免代码重复
总结

模板方法模式优点:

在父类中形式化地定义一个算法,而由它的子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序。

模板方法模式是一种代码复用技术,它在类库设计中尤为重要,它提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为,它鼓励我们恰当使用继承来实现代码复用。

可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行。

在模板方法模式中可以通过子类来覆盖父类的基本方法,不同的子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责原则和开闭原则。

模板方法模式缺点:

需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统更加庞大,设计也更加抽象,此时,可结合桥接模式来进行设计。

参考:

http://blog.csdn.net/lmj623565791/article/details/26276093
http://blog.sina.com.cn/s/blog_7f311ef50102uxvv.html
http://blog.csdn.net/yanbober/article/details/45501715
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: