介绍:
模板方法模式属于行为型模式。定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
类图:
AbstractClass(抽象模板类):定义了一套算法框架。 ConcreteClass(具体实现类):实现模板方法步骤中未执行的方法。
用法: • 多个子类有公共的方法,并且逻辑基本相同时。 • 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。 • 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽到父类中,然后通过子类约束其行为。
个人理解: 这个模式非常简单,实际上是封装一个固定流程:第一步做什么、第二部做什么、第三部做什么…然后再用子类将步骤的方法进行替换。
例子: 在App开发中,不管是iOS还是Android,我们每一个界面控制器都会有着很多相同的方法,例如:初始化界面、初始化数据、设置相同的主题等等操作。可能很多朋友已经在无意之中用到了这种模式,下面就让我们在Andoird上试一下:
需求:实现界面控制器的基类
1、继承实现 1.1、新建一个BaseActivity基类
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
}
}
说明一下:onCreate()中调用setContentView()加载界面布局,每一个界面都有一个不同的xml文件和控制器绑定。没有学过安卓的朋友也不难理解。
1.2、定义算法框架,修改BaseActivity基类
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_base); 子类实现
initData();
initView();
}
protected abstract void initData(); //加载数据
protected abstract void initView(); //加载界面
}
1.3、让子类继承BaseActivity类
public class TestActivity extends BaseActivity {
@Override
protected void initView() {
setContentView(R.layout.activity_test);
//findViewById()等操作
}
@Override
protected void initData() {
//初始化数据
}
}
我相信有不少朋友到这一步就完事了。每个控制器都有不同的界面布局文件,在initView方法中绑定一下,看起来也没错和挺方便。
在这里,其实只是实现了初步的继承,每一个子类都还需要实现一遍setContentView()的方法。我们既然用了继承,就应该让子类中所有重复的代码都上升到父类去。
2、模板方法模式实现 2.1、修改BaseActivity类
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(initLayout()); //重点是这句
initView();
initData();
}
protected abstract int initLayout(); //加载xml布局
protected abstract void initData(); //加载数据
protected abstract void initView(); //加载界面
}
在这里,我们把setContentView()的方法放回父类中,在每一个子类传入布局id就可以了,继续看一下:
2.2、修改子类
public class TestActivity extends BaseActivity {
@Override
protected int initLayout() {
return R.layout.activity_test;
}
@Override
protected void initView() {
//findViewById()等操作
}
@Override
protected void initData() {
//初始化数据
}
}
3、总结 此模式总结概括就是流程封装。非常的简单,相信大家也在无意之中用到了这种模式。那我们不妨再检查下自己的代码,有无存在1.1中提到的问题~
感谢您的阅读~
基础篇: 设计模式前篇之——UML类图必会知识点 设计模式前篇之——一起过一下面向对象的概念 创建型模式: 简易理解设计模式之:简单工厂模式——来试试接入支付功能 简易理解设计模式之:工厂方法模式——数据存储例子 简易理解设计模式之:抽象工厂模式——更换数据库例子 简易理解设计模式之:建造者模式——学习使用“链式调用” 简易理解设计模式之:原型模式——深、浅拷贝的概念 简易理解设计模式之:单例模式——单例模式的几种常用写法 结构型模式: 简易理解设计模式之:适配器模式——Android列表视图控件设计方式 简易理解设计模式之:桥接模式——穿衣服经典案例2 简易理解设计模式之:组合模式——实现View中的树状结构 简易理解设计模式之:装饰模式——穿衣服经典案例 简易理解设计模式之:外观模式——第三方SDK的帮助类 简易理解设计模式之:享元模式——五子棋游戏例子 简易理解设计模式之:代理模式——iOS视图控件设计方式 行为型模式: 简易理解设计模式之:策略模式——优化一下支付功能 简易理解设计模式之:模板方法模式——Android中的BaseActivity基类 简易理解设计模式之:观察者模式——监听与回调 简易理解设计模式之:状态模式——优化登录操作 简易理解设计模式之:备忘录模式——Word文档的工作原理 简易理解设计模式之:迭代器模式——遍历对象的好帮手 简易理解设计模式之:命令模式——实现命令的参数化配置 简易理解设计模式之:责任链模式——OA中请假流程示例 简易理解设计模式之:中介者模式——多人聊天室例子 简易理解设计模式之:解释器模式——语言和文法 简易理解设计模式之:访问者模式——员工考核例子