资讯专栏INFORMATION COLUMN

Template Method: 从李渊开国看模板方法模式

April / 1087人阅读

摘要:从李渊开国看模板方法模式假如史书记载没有水分的话,那么相对于其他开国皇帝,李渊的难度最低,毕竟什么事情都交给他儿子干就完事了。而李世民则接受李渊的调遣,负责实现各个细节。模板方法模式是抽象与实践分离的又一个经典实践。

Template Method: 从李渊开国看模板方法模式

假如史书记载没有水分的话,那么相对于其他开国皇帝,李渊的难度最低,毕竟什么事情都交给他儿子干就完事了。

从晋阳起兵,李渊父子用了七年时间,先后消灭薛举父子、李轨、宋金刚、刘武周、王世充、窦建德、萧铣、杜伏威和梁师都等割据势力。

其中薛举父子、宋金刚、刘武周、王世充、窦建德、杜伏威(招降)、梁师都都是被李世民击败的。

那么我们把李渊开国用Java代码描述就是:

abstract class 李渊{
    abstract void 消灭薛举父子();
    abstract void 消灭李轨();
    abstract void 消灭宋金刚();
    abstract void 消灭刘武周();
    abstract void 消灭王世充();
    abstract void 消灭窦建德();
    void 消灭萧铣(){
        System.out.println("消灭了萧铣");
    }
    abstract void 召降杜伏威();
    abstract void 消灭梁师都();
}

然后你可以看到,除了消灭萧铣,我把其他方法都写成了抽象方法,因为我们知道这些事都不是李渊自己直接做的。

那么李渊想建立唐朝的话,他只需要一个个调用方法就行了

abstract class 李渊{
    abstract void 消灭薛举父子();
    abstract void 消灭李轨();
    abstract void 消灭宋金刚();
    abstract void 消灭刘武周();
    abstract void 消灭王世充();
    abstract void 消灭窦建德();
    void 消灭萧铣(){
        System.out.println("消灭了萧铣");
    }
    abstract void 召降杜伏威();
    abstract void 消灭梁师都();

    public void 建立唐朝(){
        消灭薛举父子();
        消灭李轨();
        消灭宋金刚();
        消灭刘武周();
        消灭王世充();
        消灭窦建德();
        消灭萧铣();
        召降杜伏威();
        消灭梁师都();
        System.out.println("李唐建立了");
    }
}

简单的来说就是这样的。但是真的想开国的话,不能只有抽象方法啊,还必须一步一步的真正的实现上面的方法,这时候李世民就来了。李世民作为李渊的儿子,直接继承父类就行了。

class 李世民 extends 李渊{
    @Override
    void 消灭薛举父子() {
        System.out.println("消灭薛举父子");
    }

    @Override
    void 消灭李轨() {
        System.out.println("消灭李轨");
    }

    @Override
    void 消灭宋金刚() {
        System.out.println("消灭宋金刚");
    }

    @Override
    void 消灭刘武周() {
        System.out.println("消灭刘武周");
    }

    @Override
    void 消灭王世充() {
        System.out.println("消灭王世充");
    }

    @Override
    void 消灭窦建德() {
        System.out.println("消灭窦建德");
    }

    @Override
    void 召降杜伏威() {
        System.out.println("召降杜伏威");
    }

    @Override
    void 消灭梁师都() {
        System.out.println("消灭梁师都");
    }
}

我们的李世民类实现了李渊没有实现的方法。

然后我们来测试下建立唐朝

public class Test {
    public static void main(String[] args) {
        李渊 liYuan = new 李世民();
        liYuan.建立唐朝();
    }
}

李渊 liYuan = new 李世民();这个语句逻辑上看着有点怪异啊,不过意思就是这个意思吧。

作为父类的李渊,给出了统一天下的整体战略,而具体实施的细节就是交给子类来,让我们的代码依赖于抽象而不是具体的实现,这是软件工程中的经典做法。

假如另一个时空,没有李世民,那么李渊也可以让其他子女替他完成各个战略,比如这样的

class 平阳公主 extends 李渊{
    @Override
    void 消灭薛举父子() {
        System.out.println("平阳公主了消灭薛举父子");
    }
    // ...
}


public class Test {
    public static void main(String[] args) {
        李渊 liYuan = new 平阳公主();
        liYuan.建立唐朝();
    }
}

模板方法的核心在于为了完成一件事情(比如建立唐朝),很有可能需要做大量的事情。

但是如果让一个类包含实现这个目的所用到所有的细节,会让代码很臃肿。我们把抽象和实现分离。李渊作为总指挥官,负责全局战略上的全局调度,但是不负责细节的实现。而李世民则接受李渊的调遣,负责实现各个细节。

模板方法模式是抽象与实践分离的又一个经典实践。

原文发布于github

https://github.com/fish-stack...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75444.html

相关文章

  • flask文档学习笔记1-快速入门

    摘要:示例如下静态路由使用动态变量的路由未指定变量类型使用动态变量的路由指定变量类型指定的路由变量,可以作为被装饰的函数参数传入进来。 开始决定认真的在网上写一些东西,主要原因还是在于希望能提升学习效果。虽说python写了有几年,但是web后端框架的确没怎么接触过,买了本狗书寥寥草草的过了一遍,发现很多东西还是理解不深,真的是好记性不如烂笔头,知识也要从基础开始,退回来好好看看官方文档,再...

    lingdududu 评论0 收藏0
  • 组件(4):使用slot进行内容分发

    摘要:绑定到子组件属性绑定到父组件属性在子组件模板内将指令绑定到子组件属性列表第一项,由于父组件找不到属性,将不会显示。哪都通快递龙虎山天师府曜星社内容分发中的被插入中,并且因为中的指令而进行迭代,迭代之后通过获取上的属性数据。 组件的作用域(一) 父组件模板的内容在父组件作用域内编译;子组件模板的内容在子组件作用域内编译。 父子组件的编译相互独立,编译时只能使用各自作用域中的属性和方法,例...

    YanceyOfficial 评论0 收藏0
  • 组件(4):使用slot进行内容分发

    摘要:绑定到子组件属性绑定到父组件属性在子组件模板内将指令绑定到子组件属性列表第一项,由于父组件找不到属性,将不会显示。哪都通快递龙虎山天师府曜星社内容分发中的被插入中,并且因为中的指令而进行迭代,迭代之后通过获取上的属性数据。 组件的作用域(一) 父组件模板的内容在父组件作用域内编译;子组件模板的内容在子组件作用域内编译。 父子组件的编译相互独立,编译时只能使用各自作用域中的属性和方法,例...

    molyzzx 评论0 收藏0
  • JavaScript > Juicer.js源码解读

    摘要:具体可配置的项可以参看其源代码。那引擎对象是如何被构造出来的呢看这句由此,我们进入了的核心构造函数,。由于该构造函数篇幅很长,我们先看下简略版的结构,然后拆开来分析。此外,推荐使用注册自定义函数,而非使用。 Juicer.js源码解读 Version: 0.6.9-stable Date: 8th of Aug, 2015 个人能力有限,如有分析不当的地方,恳请指...

    mrcode 评论0 收藏0
  • springmvc常用注解标签详解

    摘要:分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了注解。作用该注解用于将的方法返回的对象,通过适当的转换为指定格式后,写入到对象的数据区。用于注解层,在类上面注解。使用标记的参数。 1、@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个M...

    notebin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<