您的位置:首页 > 移动开发 > Android开发

《Android源码设计模式》读书笔记 (15) 第15章 模板方法模式

2016-02-21 16:28 459 查看

前言

这个模式也是之前见得比较少的.

用一句话来形容就是:流程封装,具体实现由子类来完成.但是任意一个抽象类,都符合具体实现细节由子类完成的要求,关键在于是否有流程,有流程的叫模板方法模式,没有流程,就是抽象类的实现.

定义

定义:定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 可以联想下我们平时用到的OKhttpUtils网络连接框架,是否是该模板方法设计模式的一个典型的实现.

优点:

1.封装不变部分,扩展可变部分

2.提取公共部分代码,便于维护

缺点:模板方法会带来代码的阅读难度,会让用户觉得难以理解.

使用场景:

1.多个子类有公有的方法,并且逻辑基本相同.

2.重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现.

3.重构时,模板方法模式是一个经典的使用模式.

UML类图



AbsTemplate:抽象类,定义了一套算法框架

ConcreteImplA:具体实现类A

ConcreteImplB:具体实现类B

实现步骤

根据书上提供的电脑开机在不同电脑上,也就是不同环境下,需要修改某些特定的步骤,但是不能改变开机的算法框架.

AbstractComputer:AbsTemplate的作用,提供开机必要的4个步骤方法以及开机算法框架

/**
* 抽象的computer,提供开机必要的4个步骤方法以及开机算法框架
* @author max
*
*/
public abstract class AbstractComputer {

// 开电源
public void powerOn() {

}

// 硬件检测
public void check() {

}

// 载入操作系统
public void loadOS() {

}

// 开用户登录
public void login() {

}

//开机算法框架
public final void startUp(){
powerOn();
check();
loadOS();
login();
}
}


CoderComputerMilitaryComputer:在不同环境下,需要修改某些特定的步骤

/**
* 军用计算机,具体的子类
* @author max
*
*/
public class MilitaryComputer extends AbstractComputer {
//然而军用的电脑,更关心硬件防火墙和登录这块的安全性,重定义当前开机框架的登录和ckeck步骤的方法即可
@Override
public void check() {
super.check();
}

@Override
public void login() {
super.login();
}

}


/**
* 程序员的计算机,具体的子类
* @author max
*  */
public class CoderComputer extends AbstractComputer {

//程序员的电脑,只需要关系登录这块,重定义当前开机框架的登录步骤的方法即可
@Override
public void login() {
super.login();
}

}


client:最后即客户端调用

//模板方法的调用
private void templateMothed() {
AbstractComputer computer = new CoderComputer();
computer.startUp();

computer = new MilitaryComputer();
computer.startUp();
}


源码下载

源码demo下载.http://download.csdn.net/detail/qq_28690547/9438332
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息