近几年,共享单车的流行极大的方便了人们的短途出行,那么,骑单车一般需要几个步骤呢,一般就是找车,扫码,骑车,结束行程,整个流程如图所示:
在程序设计中,如何用程序实现这个规范呢,其实在现实生活中,类似的问题有很多,比如早上洗漱,我们需要刷牙,洗脸,擦脸等步骤,去餐馆就餐需要点餐,吃饭,买单,这些问题都有一个共同的特点就是一般都是由几个有序的步骤组成,在程序设计中,实现的方式也各式各样,在此推荐设计模式中的模板方法模式来实现此类问题。
模板模式应该是设计模式中比较简单的一种行为型设计模式,模板模式的主要特点是定义一个流程的实现步骤,具体的步骤由子类来扩展
1.模板方法模式(Template Pattern)的定义
定义一个流程算法的框架,将具体的实现延迟到子类中,使得子类可以不改变一个算法的整体结构即可重定义该算法的某些特定步骤。
2.模板方法模式的UML类图
2.1 模板方法模式UML类图说明
AbstractTemplate:抽象类,定义了流程实现的具体步骤,每个步骤的方法可以是抽象的也可以是具体的,在上面的UML类图中为了简化定义为了抽象方法,此外还有一个具体实现的模板方法:TemplateMethod,用来规范整个流程的主要框架结构
SubClass*:具体的子类,继承了抽象父类,可以重写抽象父类中定义的每个步骤,
对于标准的模板方法模式除了有模板方法,具体方法之外,还有一个方法就是钩子方法,钩子方法的主要定义的是对某一步骤是否需要执行,定义在抽象父类中,返回的是个Boolean类型的值,作为某个或者某些具体步骤执行的开发,子类可以重写抽象父类中定义的钩子方法。
3.模板方法模式的具体实现
以单车骑行作为代码实例,具体的讲解模板方法模式的使用
3.1 抽象类的主要代码
public abstract class AbstractTemplate {
public final void templateMethod() {
//1.找车
this.findBicycle();
//2.扫码
this.scan();
//3.骑行
this.cycling();
//4.结束行程
this.finish();
}
/**
* 找车
*/
public abstract void findBicycle();
/**
* 扫码
*/
public abstract void scan();
/**
* 开始骑行
*/
public abstract void cycling();
/**
* 结束行程
*/
public abstract void finish();
}
抽象父类主要包括5个方法:
templateMethod:模板方法,整个流程的框架,包括了单车骑行的主要操作步骤
findBicycle:寻找单车的方法,抽象方法
scan:扫单车二维码的方法,抽象方法
cycling:主要骑行方法,抽象方法
finish:结束行程方法,抽象方法
具体子类代码片段:
public class SubClassA extends AbstractTemplate {
@Override
public void findBicycle() {
System.out.println("找到一辆单车");
}
@Override
public void scan() {
System.out.println("打开APP扫码");
}
@Override
public void cycling() {
System.out.println("开始骑行");
}
@Override
public void finish() {
System.out.println("骑完结束行程");
}
}
子类SubClassA重写了父类的几个抽象方法
下面是是单元测试的代码片段:
public class TemplatePatternTest {
public static void main(String[] args) {
AbstractTemplate abstractTemplate=new SubClassA();
abstractTemplate.templateMethod();
}
}
主要执行结果:
以上就是用模板方法模式简单的描述了一下用例的流程,在的开发中,具体应用应该具体来分析
4.模板方法模式体现的设计原则
在上面的代码实例中,我们注意到,在定义父类的模板方法的时候,我们将模板方法增加了final修饰,这样做的目的是为了子类对于父类的扩展原则是应该不修改父类原有的基本方法,模板方法在定义上面就是来定义整个框架的,而这个设计也符合设计模式中的“开闭原则”-对扩展开放,对修改关闭
5.模板方法模式总结
模板方法模式定义了流程的整个框架,把重复的代码放到父类中来实现,具体功能的实现由子类去扩展,也取得了代码复用的好处,模板方法模式是一个相对简单的模式,在具体的业务中用的也很多,但是,我们使用设计模式的初衷是使整个的逻辑更简洁,更容易扩展,而不是将逻辑变得更复杂,如果对于一个功能,比较单一,而几行代码就能搞定,没必要使用复杂的设计模式来解决
**下期预告:策略模式**