模板模式(template) - - (模式之十)

来源:互联网 发布:mysql 数据表迁移 编辑:程序博客网 时间:2024/06/06 17:18
1.概念
GOF给模板方法(Template Method)模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这里的算法的结构,可以理解为你根据需求设计出来的业务流程。特定的步骤就是指那些可能在内容上存在变数的环节。

:重点是操作的算法的骨架不变,即:运算的顺序不发生改变

2.图示


组成对象:
1).AbstractClass(抽象类):定义了一到多个的抽象方法,以供具体的子类来实现它们;而且还要实现一个模板方法,来定义一个算法的骨架。
该模板方法不仅调用前面的抽象方法,也可以调用其他的操作,只要能完成自身的使命。
2).ConcreteClass(具体类):实现父类中的抽象方法以完成算法中与特定子类相关的步骤

3.代码

package template;
/**
* 模板方法,侧重点模板体现不变的步骤由父类统一来做,
* 子类只需要实现具体每一步骤怎么做就可以
* @author lvzh
*/
public class AbstractClass {
public final void dowork(){
//现做operation1
operation1();
//在做operation1
operation2();
/**
* 以及其他的一些公共的操作
*/
}
public void operation1(){
/*父类空实现*/
}
public void operation2(){
/*父类空实现*/
}
}

// 子类

package template;
/**
* 在子类中可以去重写具体每一个步骤实现的具体要求和算法
* 也可以继承父类的,不加以实现,
* 每个子类可以有不同的实现
* @author lvzh
*/
public class ConceretClass extends AbstractClass{
public void operation1(){
/**
* 实现 MD5加密
*/
}
public void operation2(){
/***
* 保存到文件中
*/
}
}

4.用途

1) 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2) 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
3) 控制子类扩展。如果你不愿子类来修改你的模板方法定义的框架,
你可以采用两种方式来做:
一是在API中不体现出你的模板方法;
二是将你的模板方法置为final就可以了。一般情况是采用第二种方法

原创粉丝点击