Android设计模式--模板方法模式

一,定义

定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

在面向对象的开发过程中,通常会遇到这样一个问题,我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序,但是,某些步骤的具体实现是未知的,或者说某些步骤的实现是会随着环境的变化而改变的,例如,执行程序的流程大致如下:

1,检查代码的正确性

2,链接相关的类库

3,编译相关代码

4,执行程序

对于不同的程序设计语言,上述四个步骤都是不一样的,但是,他们的执行流程是固定的,这类问题的解决方案就是模板方法模式。

模板方法实际上是封装一个固定流程,就像是一套执行模板一样,第一步该做什么,第二步该做什么都已经在抽象类中定义好。而子类可以有不同的算法实现,在框架不被修改的情况下实现某些步骤的算法替换。

二,使用场景

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

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

3,重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。

角色介绍:

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

具体实现类:实现具体算法框架

三,使用案例

在英雄联盟游戏中,玩家要开始一场排位游戏,需要先1,进入匹配队列 2,进入banpick界面3,禁用英雄 4,选择英雄 5,选择符文和召唤师技能 6,进入游戏

如果使用模板模式,怎么来实现呢?

首先定义一个抽象模板类:

java 复制代码
public class AbsRank {

    public void startMate(){
        System.out.println("进入匹配队列");
    }

    public void startBp(){
        System.out.println("进入bp界面");
    }

    public void startBan(){
        System.out.println("开始禁用英雄");
    }

    public void select(){
        System.out.println("选择英雄");
    }

    public void selectSkill(){
        System.out.println("选择符文和召唤师技能");
    }

    public void begin(){
        System.out.println("开始游戏");
    }

    public final void playGame(){
        startMate();
        startBp();
        startBan();
        select();
        selectSkill();
        begin();
    }
}

定义两个玩家类:

java 复制代码
public class Yuanzhen extends AbsRank{

    @Override
    public void startBan() {
        System.out.println("禁用亚索");
    }

    @Override
    public void select() {
        System.out.println("选择剑圣");
    }

    @Override
    public void selectSkill() {
        System.out.println("选择惩戒和闪现");
    }
}
java 复制代码
public class Xiaoming extends AbsRank{

    @Override
    public void startBan() {
        System.out.println("禁用赵信");
    }

    @Override
    public void select() {
        System.out.println("选择蛮王");
    }

    @Override
    public void selectSkill() {
        System.out.println("选择疾跑和闪现");
    }
}

使用 :

java 复制代码
Yuanzhen yuanzhen =new Yuanzhen();
yuanzhen.playGame();
Xiaoming xiaoming =new Xiaoming();
xiaoming.playGame();

最后结果:

四,总结

模板方法模式用四个字概括就是:流程封装。也就是把某个固定的流程封装到一个final函数中 ,并且让子类能够定制这个流程中的某些或者所有步骤,这就要求父类提取共用的代码,提升代码的复用率,同时也带来了更好的可扩展性。

优点:

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

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

缺点:

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

相关推荐
蓝瑟9 小时前
告别重复造轮子!业务组件多场景复用实战指南
前端·javascript·设计模式
Arva .11 小时前
讲一下 Spring 中用到的设计模式
java·spring·设计模式
繁华似锦respect13 小时前
lambda表达式中的循环引用问题详解
java·开发语言·c++·单例模式·设计模式·哈希算法·散列表
星月IWJ16 小时前
领域驱动设计学习
java·学习·设计模式
_dindong17 小时前
Linux网络编程:Reactor反应堆模式
linux·服务器·网络·设计模式·php
雨中飘荡的记忆17 小时前
Step Builder模式实战
java·设计模式
Eren7Y琳18 小时前
开箱即用构建应用环境:openEuler易获得性深度验证
redis·设计模式·架构
Unstoppable2218 小时前
八股训练营第 39 天 | Bean 的作用域?Bean 的生命周期?Spring 循环依赖是怎么解决的?Spring 中用到了那些设计模式?
java·spring·设计模式
闲人编程19 小时前
微服务API网关设计模式
python·缓存·微服务·设计模式·系统安全·api·codecapsule
__万波__19 小时前
二十三种设计模式(八)--装饰器模式
java·设计模式·装饰器模式