首页 > 编程语言 >设计模式-模板模式在Java中的使用示例-悍马模型制造示例

设计模式-模板模式在Java中的使用示例-悍马模型制造示例

时间:2023-04-19 11:58:28浏览次数:45  
标签:Java 示例 悍马 void System protected 设计模式 public 模板

场景

设计模式-模板模式在Java中的使用示例:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130230732

上面整理了模板模式的使用示例,为加强理解特记录另一个使用示例,

以下示例摘自设计模式之禅第二版。

模板方法模式

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

抽象模板方法分为两类: 基本方法(也叫作基本操作,是由子类实现的方法,并且在模板中被调用) 和

模板方法(可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑)。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

实现

模板模式通用代码

1、抽象模板类

public abstract class AbstractClass {
    //基本方法
    protected abstract void doSomething();
    //基本方法
    protected abstract void doAnything();
    //模板方法
    protected void templateMethod(){
        /**
         * 调用基本方法,完成相关的逻辑
         */
        this.doAnything();
        this.doSomething();
    }
}

2、具体模板类1

//具体模板类
public class ConcreteClass1 extends AbstractClass{
    @Override
    protected void doSomething() {
        //业务逻辑处理
    }

    @Override
    protected void doAnything() {
        //业务逻辑处理
    }
}

3、具体模板类2

//具体模板类
public class ConcreteClass2 extends AbstractClass{
    @Override
    protected void doSomething() {
        //业务逻辑处理
    }

    @Override
    protected void doAnything() {
        //业务逻辑处理
    }
}

4、场景类

//场景类
public class Client {
    public static void main(String[] args) {
        AbstractClass class1 = new ConcreteClass1();
        AbstractClass class2 = new ConcreteClass2();
        //调用模板方法
        class1.templateMethod();
        class2.templateMethod();
    }
}

模板模式示例-悍马模型制作演示

1、悍马车有两个型号,H1和H2,实现抽象悍马模型

public abstract class HummerModel {
    /**
     * 首先这个模型要能发动起来,别管是手摇发动,还是电力发动,反正是要能够发动起来,那这个实现要在实现类里了
     */
    public abstract void start();
    //能发动,还要能停下来
    public abstract void stop();
    //喇叭会出声音,是滴滴叫,还是哔哔叫
    public abstract void alarm();
    //引擎会轰隆隆地响,不响那是假的
    public abstract void engineBoom();
    //模型需要会跑,不管人推的还是电力驱动的,总之要会跑
    public void run(){
        //先发动汽车
        this.start();
        //引擎开始轰鸣
        this.engineBoom();
        //然后开始跑,过程中遇到挡路的就按喇叭
        this.alarm();
        //到达目的地就停车
        this.stop();
    }
}

2、悍马H1具体模板类

public class HummerH1Model extends HummerModel{
    @Override
    public void start() {
        System.out.println("悍马H1启动");
    }

    @Override
    public void stop() {
        System.out.println("悍马H1停止");
    }

    @Override
    public void alarm() {
        System.out.println("悍马H1鸣笛");
    }

    @Override
    public void engineBoom() {
        System.out.println("悍马H1引擎轰轰响");
    }
}

3、悍马H2具体模板类

public class HummerH2Model extends HummerModel{
    @Override
    public void start() {
        System.out.println("悍马H2启动");
    }

    @Override
    public void stop() {
        System.out.println("悍马H2停止");
    }

    @Override
    public void alarm() {
        System.out.println("悍马H2鸣笛");
    }

    @Override
    public void engineBoom() {
        System.out.println("悍马H1引擎哔哔响");
    }
}

4、悍马场景类

在抽象的悍马模型上已经定义了run方法的执行规则。

场景类实现的任务就是把生产出的模型展现给客户。

public class HummerClient {
    public static void main(String[] args) {
        //某公司要H1型号的悍马
        HummerModel h1 = new HummerH1Model();
        //H1模型展示
        h1.run();
    }
}

模板模式示例-悍马模型需求扩展改造

1、客户需求更改,提出H1型号的悍马喇叭想让它响就响,H2的喇叭不要有声音。

在抽象类中新增一个实现方法isAlarm,确定各个型号的悍马是否需要声音,由各个实现类覆写该方法,

同时其它的基本方法由于不需要对外提供访问,因此也设计为protected类型。

public abstract class HummerExtendModel {
    /**
     * 首先这个模型要能发动起来,别管是手摇发动,还是电力发动,反正是要能够发动起来,那这个实现要在实现类里了
     */
    protected abstract void start();
    //能发动,还要能停下来
    protected abstract void stop();
    //喇叭会出声音,是滴滴叫,还是哔哔叫
    protected abstract void alarm();
    //引擎会轰隆隆地响,不响那是假的
    protected abstract void engineBoom();
    //模型需要会跑,不管人推的还是电力驱动的,总之要会跑
    final public void run(){
        //先发动汽车
        this.start();
        //引擎开始轰鸣
        this.engineBoom();
        //然后开始跑,过程中遇到挡路的就按喇叭
        //要让它叫的时候就叫,喇叭不想让它响就不响
        if(this.isAlarm()){
            this.alarm();
        }
        //到达目的地就停车
        this.stop();
    }
    //钩子方法,默认喇叭是会响的
    protected boolean isAlarm(){
        return true;
    }
}

2、H1扩展具体模板类

public class HummerH1ExtendModel extends HummerExtendModel{
    //要响喇叭
    private boolean alarmFlag = true;

    @Override
    protected void start() {
        System.out.println("悍马H1启动");
    }

    @Override
    protected void stop() {
        System.out.println("悍马H1停止");
    }

    @Override
    protected void alarm() {
        System.out.println("悍马H1鸣笛");
    }

    @Override
    protected void engineBoom() {
        System.out.println("悍马H1引擎轰轰响");
    }

    protected boolean isAlarm(){
        return this.alarmFlag;
    }
    //要不要响喇叭,是由客户来决定的
    public void setAlarm(boolean isAlarm){
        this.alarmFlag = isAlarm;
    }
}

3、H2具体模板类

public class HummerH2ExtendModel extends HummerExtendModel{

    @Override
    protected void start() {
        System.out.println("悍马H2启动");
    }

    @Override
    protected void stop() {
        System.out.println("悍马H2停止");
    }

    @Override
    protected void alarm() {
        System.out.println("悍马H2鸣笛");
    }

    @Override
    protected void engineBoom() {
        System.out.println("悍马H2引擎轰轰响");
    }

    //默认是没有喇叭的
    protected boolean isAlarm(){
        return false;
    }

}

4、场景类

public class HummerExtendClient {
    public static void main(String[] args) throws IOException {
        System.out.println("----H1型号悍马----");
        System.out.println("H1型号的悍马是否需要喇叭声响?0-不需要  1-需要");
        String type = (new BufferedReader(new InputStreamReader(System.in))).readLine();
        HummerH1ExtendModel h1 = new HummerH1ExtendModel();
        if(type.equals("0")){
            h1.setAlarm(false);
        }
        h1.run();
        System.out.println();
        System.out.println("----H2型号悍马----");
        HummerH2ExtendModel h2 = new HummerH2ExtendModel();
        h2.run();
    }
}

 

总结

模板方法模式的优点

封装不变部分,扩展可变部分
把认为是不变部分的算法封装到父类实现,而可变部分的则可以通过继承来继续扩展。在悍马模型例子中,是不是就非常容易扩展?例如增加一个H3型号的悍马模型,很容易呀,增加一个子类,实现父类的基本方法就可以了。

提取公共部分代码,便于维护
我们例子中刚刚走过的弯路就是最好的证明,如果我们不抽取到父类中,任由这种散乱的代码发生,想想后果是什么样子?维护人员为了修正一个缺陷,需要到处查找类似的代码!

行为由父类控制,子类实现
基本方法是由子类实现的,因此子类可以通过扩展的方式增加相应的功能,符合开闭原则。

模板方法模式的缺点

按照我们的设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目中,会带来代码阅读的难度,而且也会让新手产生不适感。

模板方法模式的使用场景

- 多个子类有公有的方法,并且逻辑基本相同时。
- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
- 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数(见“模板方法模式的扩展”)约束其行为。

 

标签:Java,示例,悍马,void,System,protected,设计模式,public,模板
From: https://www.cnblogs.com/badaoliumangqizhi/p/17332811.html

相关文章

  • 每日八股文之Java
    1、请你说说死锁定义及发生的条件得分点:争夺共享资源、相互等待、互斥条件、请求和保持条件、不剥夺条件、环路等待条件死锁定义:两个或两个以上的进程在执行过程中,因争夺共享资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或......
  • JavaScript 隐式类型转换有哪些副作用
    JavaScript隐式类型转换有哪些副作用在JavaScript中,隐式类型转换指的是在运行时自动将一个数据类型转换为另一个数据类型。虽然JavaScript中的隐式类型转换有时可以使代码更简洁,但也会带来一些副作用,包括:难以预测的结果:由于JavaScript在隐式类型转换时会自动进行一些操......
  • java获取包下所有的类
    1.背景给一个Java的包名,获取包名下的所有类..根据类上的注解,可以展开很多统一操作的业务2.直接看代码packagecom.common.config.mq.supplier;importcom.common.config.mq.MqRegister;importlombok.extern.slf4j.Slf4j;importjava.io.File;importjava.lang.refle......
  • 重学Java设计模式-行为型模式-迭代器模式
    重学Java设计模式-行为型模式-迭代器模式内容摘自:https://bugstack.cn/md/develop/design-pattern/2020-06-23-重学Java设计模式《实战迭代器模式》.html#重学-java-设计模式-实战迭代器模式「模拟公司组织架构树结构关系-深度迭代遍历人员信息输出场景」迭代器模式介绍图......
  • 获取java HashMap 的容量和阈值
      publicstaticvoidmain(String[]args)throwsException{HashMap<Integer,Integer>m=newHashMap<>(9);Class<?>mapType=m.getClass();Fieldthreshold=mapType.getDeclaredField("threshold");......
  • Java 类的成员——成员变量
    如何声明成员变量语法格式:[修饰符1]class类名{[修饰符2]数据类型成员变量名[=初始化值];}说明:–          位置要求:必须在类中,方法外–          修饰符2(暂不考虑)常用的权限修饰符有:private、缺省、protected、public其他修饰符:st......
  • 重学Java设计模式-行为型模式-命令模式
    重学Java设计模式-行为型模式-命令模式内容摘自:https://bugstack.cn/md/develop/design-pattern/2020-06-21-重学Java设计模式《实战命令模式》.html#重学-java-设计模式-实战命令模式「模拟高档餐厅八大菜系-小二点单厨师烹饪场景」命令模式介绍图片来自:https://refactori......
  • 6.自定义注解与设计模式
    自定义注解与设计模式课程目标熟悉注解底层实现原理完成ORM框架底层原理常用设计模式单例、工厂、代理一.自定义注解1.1什么是注解?Jdk1.5新增新技术,注解。很多框架为了简化代码,都会提供有些注解。可以理解为插件,是代码级别的插件,在类的方法上写:@XXX,就是在......
  • 7.Java 网络编程之 Socket
    Java网络编程之Socket一、课程目标网络模型TCP协议与UDP协议区别Http协议底层实现原理。二、什么是网络模型网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然......
  • Python OpenCV 3.x 示例:1~5
    原文:OpenCV3.xwithPythonByExample协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN计算机视觉译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。一、将几何变换应用于图像在本......