zoukankan      html  css  js  c++  java
  • 模板方法模式详解

    序言

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

    本来还想着能多看一点设计模式总结一下呢,然后转眼已经马上要到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()方法规定的顺序调用本类的其他方法。

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

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

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

     

  • 相关阅读:
    新建安卓项目后,manifest.xml中会出现大段的黄色警告
    TextView设置setCompoundDrawables不生效解决办法
    数据结构->队列->顺序循环队列ADT代码
    数据结构->栈->顺序栈ADT代码
    JAVA环境变量的配置
    计算机科学的范围-----18.12.08
    字符串复制
    扔鸡蛋问题和找零钱问题
    动态规划
    最小二乘法
  • 原文地址:https://www.cnblogs.com/lilinzhiyu/p/8144470.html
Copyright © 2011-2022 走看看