本文实例讲述了Android编程设计模式之模板方法模式。分享给大家供大家参考,具体如下:
在面向对象开发过程中,通常会遇到这样的一个问题,我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序,但是,某些步骤的具体实现是未知的,或者说某些步骤的实现是会随着环境的变化而改变的,例如,执行程序的流程大致如下:
1。检查代码的正确性;
2.链接相关的类库;
3.编译相关代码;
4 .执行程序。
对于不同的程序设计语言,上述4个步骤都是不一样的,但是,它们的执行流程是固定的,这类问题的解决方案就是我们本章要讲的模板方法模式。
定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
多个子类有公有的方法,并且逻辑基本相同时。
重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。
<强> UML类图:强>
<>强角色介绍:强>
:抽象类,定义了一套算法框架。
:具体实现类1 .
:具体实现类2 .
模板方法实际上是封装一个固定流程,就像是一套执行模板一样,第一步该做什么,第二步该做什么都已经在抽象类中定义好。而子类可以有不同的算法实现,在框架不被修改的情况下实现某些步骤的算法替换、下面以打开计算机这个动作来简单演示一下模板方法。打开计算机的整个过程都是相对固定的,首先启动计算机电源,计算机检测自身状态没有问题时将进入操作系统,对用户进行验证之后即可登录计算机、下面我们使用模板方法来模拟一下这个过程:
抽象的计算机
/* * *抽象的电脑 */公共抽象类AbstractComputer {//下面是抽象方法,子类可以覆盖,不允许外部直接调用这些方法,所以用保护/* * *开启电源 */保护文摘空白集成软件包();/* * *检查硬件 */保护文摘空白checkHardware ();/* * *载入操作系统 */保护文摘空白loadOS ();/* * * 登录 */保护文摘无效登录();//下面是钩子方法,声明并实现/* * *是否需要登录 * * @return真正为需要登录 */保护布尔isLogin () { 返回true; }//下面是模板方法,定义为决赛,子类不能覆盖此方法/* * *启动计算机方法,步骤为开启电源,系统检查,加载系统,检查是否登录。 */公众最终无效启动(){ system . out。println(“- - - - - - - - - -开机开始- - - - - - - - - -”); 集成软件包(); checkHardware (); loadOS (); 如果(isLogin ()) { 登录(); } system . out。println(“- - - - - - - - - -开机- - - - - - - - - -”); } } >之前Windows系统电脑(不需登录):
/* * * Windows系统电脑 */公开课WindowsComputer延伸AbstractComputer { @Override 保护无效集成软件包(){ System.out.println (“Windows电脑开启电源”); } @Override 保护无效checkHardware () { System.out.println (“Windows电脑检查硬件”); } @Override 保护无效loadOS () { System.out.println (“Windows电脑载入操作系统”); } @Override 保护无效登录(){ } @Override 保护布尔isLogin () { 返回false;//返回假,不需登录 } } >之前Mac系统电脑(需登录):
/* * * Mac系统电脑 */公开课MacComputer延伸AbstractComputer { @Override 保护无效集成软件包(){ System.out.println (“Mac电脑开启电源”); } @Override 保护无效checkHardware () { System.out.println (“Mac电脑检查硬件”); } @Override 保护无效loadOS () { System.out.println (“Mac电脑载入操作系统”); } @Override 保护无效登录(){ System.out.println (“Mac电脑登录”); } }Android编程设计模式之模板方法模式详解