Android编程设计模式之模板方法模式详解
一、介绍
在面向对象开发过程中,我们经常会遇到一个算法所需的关键步骤已知,但某些步骤的具体实现会随环境变化而改变的情况,执行程序的流程大致如下:
1、检查代码的正确性;
2、链接相关的类库;
3、编译相关代码;
4、执行程序。
对于不同的编程语言,上述步骤的实现方式可能不同,但其执行顺序是固定的,这种情况下,我们可以使用模板方法模式来解决问题。
二、定义
模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现,通过这种方式,子类可以重新定义算法的某些步骤而不改变算法的结构。
三、使用场景
1、多个子类有公有的方法,并且逻辑基本相同时:可以将相同的代码抽取到父类中,避免重复代码。
2、重要、复杂的算法:可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
3、重构时:模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。
四、UML类图
角色介绍:
AbstractClass:抽象类,定义了一套算法框架。
ConcreteClass1:具体实现类1。
ConcreteClass2:具体实现类2。
五、简单示例
模板方法实际上是封装一个固定流程,就像是一套执行模板一样,第一步该做什么,第二步该做什么都已经在抽象类中定义好,而子类可以有不同的算法实现,在框架不被修改的情况下实现某些步骤的算法替换,下面以打开计算机这个动作来简单演示一下模板方法。
抽象的 Computer 类:
public abstract class AbstractComputer { // 下面是抽象方法,子类可以覆盖,不允许外部直接调用这些方法,所以用protected protected abstract void powerOn(); protected abstract void checkHardware(); protected abstract void loadOS(); protected abstract void login(); // 下面是钩子方法,声明并实现 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系统电脑(不需登录):
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系统电脑(需登录):
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(); } }
六、优缺点分析
优点:
1、提高代码复用性:将相同部分的代码放在抽象的父类中,提高了代码的复用性。
2、提高了拓展性:将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为。
3、实现了反向控制:通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制,符合“开闭原则”。
缺点:
1、增加了系统的复杂性:引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。
七、应用场景分析
1、一次性实现算法的不变部分:并将可变的行为留给子类来实现。
2、各子类中公共的行为应被提取出来:并集中到一个公共父类中以避免代码重复。
3、控制子类的扩展:模板方法只在特定点调用钩子方法,这样可以更好地控制子类的扩展。
八、相关问题与解答栏目
问题1:模板方法模式的主要作用是什么?
答:模板方法模式的主要作用是在不改变算法结构的前提下,允许子类重新定义算法的某些步骤,从而提高代码的复用性和拓展性。
问题2:为什么模板方法模式可以提高代码的复用性?
答:因为模板方法模式将不变的部分代码放在抽象的父类中,而将可变的部分代码放在具体的子类中实现,这样可以避免重复代码,提高代码的复用性。
到此,以上就是小编对于“Android编程设计模式之模板方法模式详解”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/639216.html