本文实例讲述了Android编程设计模式之模板方法模式。分享给大家供大家参考,具体如下:
一、介绍
在面向对象开发过程中,通常会遇到这样的一个问题,我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序,但是,某些步骤的具体实现是未知的,或者说某些步骤的实现是会随着环境的变化而改变的,例如,执行程序的流程大致如下:
1.检查代码的正确性;
2.链接相关的类库;
3.编译相关代码;
4.执行程序。
对于不同的程序设计语言,上述4个步骤都是不一样的,但是,它们的执行流程是固定的,这类问题的解决方案就是我们本章要讲的模板方法模式。
二、定义
定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
三、使用场景
多个子类有公有的方法,并且逻辑基本相同时。
重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。
四、模板方法模式的UML类图
UML类图:
角色介绍:
AbstractClass:抽象类,定义了一套算法框架。
ConcreteClass1:具体实现类1。
ConcreteClass2:具体实现类2。
五、简单示例
模板方法实际上是封装一个固定流程,就像是一套执行模板一样,第一步该做什么,第二步该做什么都已经在抽象类中定义好。而子类可以有不同的算法实现,在框架不被修改的情况下实现某些步骤的算法替换,下面以打开计算机这个动作来简单演示一下模板方法。打开计算机的整个过程都是相对固定的,首先启动计算机电源,计算机检测自身状态没有问题时将进入操作系统,对用户进行验证之后即可登录计算机,下面我们使用模板方法来模拟一下这个过程:
抽象的 Computer
/** * 抽象的 Computer */ public abstract class AbstractComputer { //下面是抽象方法,子类可以覆盖,不允许外部直接调用这些方法,所以用protected /** * 开启电源 */ protected abstract void powerOn(); /** * 检查硬件 */ protected abstract void checkHardware(); /** * 载入操作系统 */ protected abstract void loadOS(); /** * 登录 */ protected abstract void login(); //下面是钩子方法,声明并实现 /** * 是否需要登录 * * @return true为需要登录 */ protected boolean isLogin(){ return true; } //下面是模板方法,定义为final,子类不能覆盖此方法 /** * 启动计算机方法,步骤为开启电源、系统检查、加载系统、检查是否登录。 */ public final void startUp(){ System.out.println("--------开机 START--------"); powerOn(); checkHardware(); loadOS(); if(isLogin()){ login(); } System.out.println("-------- 开机 END --------"); } }
Windows系统电脑(不需登录):
/** * Windows系统电脑 */ public class WindowsComputer extends AbstractComputer{ @Override protected void powerOn() { System.out.println("Windows电脑开启电源"); } @Override protected void checkHardware() { System.out.println("Windows电脑检查硬件"); } @Override protected void loadOS() { System.out.println("Windows电脑载入操作系统"); } @Override protected void login() { } @Override protected boolean isLogin() { return false;//返回false,不需登录 } }
Mac系统电脑(需登录):
/** * Mac系统电脑 */ public class MacComputer extends AbstractComputer{ @Override protected void powerOn() { System.out.println("Mac电脑开启电源"); } @Override protected void checkHardware() { System.out.println("Mac电脑检查硬件"); } @Override protected void loadOS() { System.out.println("Mac电脑载入操作系统"); } @Override protected void login() { System.out.println("Mac电脑登录"); } }
调用:
public class Client { public static void main(String[] args) { AbstractComputer comp = new WindowsComputer(); comp.startUp(); comp = new MacComputer(); comp.startUp(); } }
结果:
--------开机 START-------- Windows电脑开启电源 Windows电脑检查硬件 Windows电脑载入操作系统 -------- 开机 END -------- --------开机 START-------- Mac电脑开启电源 Mac电脑检查硬件 Mac电脑载入操作系统 Mac电脑登录 -------- 开机 END --------
六、Android源码中的模板方法模式
1、AsyncTask
在使用AsyncTask时,我们都知道把耗时操作放到doInBackground(Params… params)中,在doInBackground之前,如果想做一些初始化操作,可以把实现写在onPreExecute中,当doInBackground执行完后会执行onPostExecute方法,而我们只需要构建AsyncTask对象,然后执行execute方法。
2、Activity的生命周期
ActivityThread的main函数被调用后,依次执行Activity的onCreate、onStart、onResume函数,用户通常在Activity的子类中覆写onCreate方法,并且在该方法中调用setContentView来设置布局。
七、区别
工厂方法是模板方法的一种特殊版本。
策略模式和模板方法模式都是封装算法,一个用组合,一个用继承。
策略模式和模板模式通常可以互相替换。它们都像试卷,策略模式是选择题,模板模式是填空题。
八、总结
模板方法模式用4个字概括就是:流程封装。也就是把某个固定的流程封装到一个final方法中,并且让子类能够定制这个流程中的某些或者所有步骤,这就要求父类提取公用的代码,提升代码的复用率,同时带来了更好的可扩展性。
优点:
封装不变部分,扩展可变部分。
提取公共部分代码,便于维护。
缺点:
需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统更加庞大,设计也更加抽象,此时,可结合桥接模式来进行设计。
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
介绍 模板方法(TemplateMethod)定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板方法是一种代码复用的基本技术,在类库中尤为重要,因为他们提取了类库中的公共行为。模板方法导致一种反向的控制结构,这种结构就是传说中的“好莱坞法则”,即“别找找我们,我们找你”,这指的是父类调用一个类的操作,而不是相反。具
本文向大家介绍详解C#设计模式编程中的模板方法模式使用,包括了详解C#设计模式编程中的模板方法模式使用的使用技巧和注意事项,需要的朋友参考一下 一、引言 提到模板,大家肯定不免想到生活中的“简历模板”、“论文模板”、“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载
本文向大家介绍Android编程设计模式之访问者模式详解,包括了Android编程设计模式之访问者模式详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android编程设计模式之访问者模式。分享给大家供大家参考,具体如下: 一、介绍 访问者模式是一种将数据操作与数据结构分离的设计模式,它是《设计模式》中23种设计模式中最复杂的一个,但它的使用频率并不高,正如《设计模式》的作者GOF对访
本文向大家介绍Android编程设计模式之中介者模式详解,包括了Android编程设计模式之中介者模式详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android编程设计模式之中介者模式。分享给大家供大家参考,具体如下: 一、介绍 中介者模式(Mediator Pattern)也称为调解者模式或调停者模式,Mediator本身就有调停者和调解者的意思。 在日常生活中调停者或调解者这个
本文向大家介绍学习JavaScript设计模式之模板方法模式,包括了学习JavaScript设计模式之模板方法模式的使用技巧和注意事项,需要的朋友参考一下 一、定义 模板方法是基于继承的设计模式,可以很好的提高系统的扩展性。 java中的抽象父类、子类 模板方法有两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。 二、示例 Coffee or Tea (1) 把水煮沸 (2) 用沸水浸
模板方法(Template Method) Intent 定义算法框架,并将一些步骤的实现延迟到子类。 通过模板方法,子类可以重新定义算法的某些步骤,而不用改变算法的结构。 Class Diagram Implementation 冲咖啡和冲茶都有类似的流程,但是某些步骤会有点不一样,要求复用那些相同步骤的代码。 // java public abstract class CaffeineBeve