模板方法模式详解

序言

已经很久没有写设计模式了。额。。。

本来还想着能多看一点设计模式总结一下呢,然后转眼已经马上要到2018了。有点尴尬啊。

不过也算有收获,毕竟看了别的书籍,也看了一部分Spring的源码,看起来真是晦涩难懂啊。。。

这次写这个模板方法模式也是基于看书过程中的一些契机的,那就是同步锁的一些依赖实现——队列同步器。

队列同步器的设置是基于模板设计模式的。


 

模板设计模式的实现过程

  应用背景:  

    由于本人是也算是个游戏迷,那就以今年的一款现象级游戏吃鸡(绝地求生)来讲解这个模板设计模式吧。

    这个游戏想要成为吃鸡(最后的生存者)一般需要经历以下几个步骤:匹配到玩家、跳伞、捡垃圾、跑毒圈、吃鸡。

    上述步骤中:吃鸡都是相对固定的步骤了、而匹配到玩家、跳伞、捡垃圾、跑毒圈就是存在可变性的步骤。

    好的背景就是这样,我们的目的是吃鸡、上面五个步骤就是我们吃鸡的整个过程。

    实际上,吃鸡这个游戏的核心就在跑毒圈这个这个过程中。其他过程我们是可以不用太关注的,而吃鸡是需要上述过程按照顺序排列才能够实现的,也就是说顺序也是固定的,那么我们这样设计模型:

public abstract class ChijiModel {
    //默认服务器下匹配玩家
    protected abstract void match();

    //跳伞,小心落地成盒啊
    protected abstract void jump();

    //捡垃圾,不好意思你看到我的98k了吗
    protected abstract void pick();

    //跑毒圈,你有千万种跑法
    protected abstract void run();

    //开启强制吃鸡模式
    protected boolean isChiji() {
        return true;
    }

    //大吉大利今晚吃鸡/快递员
    final public  void chiji() {
        this.match();
        this.jump();
        this.pick();
        this.run();
        if(isChiji()) {
            System.out.println("大吉大利今晚吃鸡");
        } else {
            System.out.println("化身快递员");
        }
    }
}

构建两个玩家模型:

public class GodV extends ChijiModel {
    @Override
    protected void match() {
        System.out.println("亚服匹配玩家");
    }

    @Override
    protected void jump() {
        System.out.println("跳伞哪人都我去哪");
    }

    @Override
    protected void pick() {
        System.out.println("我再也不想用ak了");
    }

    @Override
    protected void run() {
        System.out.println("开车按喇叭,手榴弹随便扔");
    }

    @Override
    protected boolean isChiji() {
        //强制吃鸡不存在的,godV开始了
        return false;
    }
}
public class Aab extends ChijiModel {
    //神奇帮助肯定能够吃鸡
    private boolean chijiFlag = true;

    @Override
    protected void match() {
        System.out.println("随便哪个服务器都是虐");
    }

    @Override
    protected void jump() {
        System.out.println("看你们落地成盒");
    }

    @Override
    protected void pick() {
        System.out.println("武器随便挑,8倍镜随便压");
    }

    @Override
    protected void run() {
        System.out.println("哎,mff我们去把那伙人打死");
    }

    @Override
    protected boolean isChiji() {
        System.out.println("开启神仙吃鸡模式");
        return chijiFlag;
    }
}

让玩家开始吃鸡:

public class PB {
    public static void main(String[] args) {
        GodV reverse = new GodV();
        Aab  ugly = new Aab();
        reverse.chiji();
        System.out.println("------------------");
        ugly.chiji();
    }
}

结果:

 

    

    概念:

      模板方法模式包含两个角色:

      抽象类:

        用于定义一系列基本操作,有具体的也有抽象的。每一个基本操作相当于一个算法步骤,在抽象类中也有一个模板方法,是实现定义算法步骤的框架的。

      具体子类:

        实现父类的抽象算法过程,也可以重写具体算法过程。

      模板方法:

        聚合整个算法步骤的框架。是一个具体的方法。

        在例子中的吃鸡明显就属于该方法

      抽象方法:

        在抽象类中没有实现,在子类中实现的方法,属于基本方法。

      具体方法:

        在抽象类中实现了的方法,属于基本方法。

      钩子方法:

        在抽象类中有实现,子类可以重写,属于基本方法。

 

    TemplateMethod()就是模板方法,operation1与operation2就是基本方法。

    模板方法是通过汇总或排序基本方法产生的结果集。

   模板方法模式:

     就是按照一个规则和顺序调用基本方法。

      具体到我们的例子中去:就是按照chiji()方法规定的顺序调用本类的其他方法。

    实际上你可以通过修改子类的实现来达到修改父类结果的效果。

 

 

本文内容是书中内容兼具自己的个人看法所成。可能在个人看法上会有诸多问题(毕竟知识量有限,导致认知也有限),如果读者觉得有问题请大胆提出,我们可以相互交流、相互学习,欢迎你们的到来,心成意足,等待您的评价。

如果喜欢的话点一波推荐吧,谢谢了。

 

 

posted @ 2017-12-29 16:21  萌新啊萌新是我  阅读(399)  评论(0编辑  收藏  举报