当前位置: 首页 > news >正文

JAVA 模板设计模式

今天来介绍下一个我觉得蛮不错的设计模式(比较容易应用于业务场景),它就是---模板设计模式。

OK,我们直接看代码:

模板模式,那当然我们需要建一个模板先,建一个抽象类,VehicleControlModel.java:

(这里我们使用一个不同车辆进行不同指令远程的业务场景)

/**
 * @Author : JCccc
 * @CreateTime : 2019-1-14
 * @Description :
 * @Point: Keep a good mood
 **/


/**
 * 汽车指令控制模板
 */
public abstract class VehicleControlModel {

        /**
         * 启动发动机
         */
        protected abstract void startEngine();

        /**
         * 关闭发动机
         */
        protected abstract void shutDownEngine();

        /**
         * 打开空调
         */
        protected abstract void openAC();


        /**
         * 关闭空调
         */
        protected abstract void closeAC();


        /**
         *
         */
         public final void excet(){
            //启动发动机
             this.startEngine();

            //关闭发动机
             this.shutDownEngine();

            //开启空调
            this.openAC();

            //关闭空调
            this.closeAC();
        }
    }
 

有了模板,接下来创建几个集成这个抽象类模板的类,也就是所谓的不同的车: 

第一辆车, 

/**
 * @Author : JCccc
 * @CreateTime : 2019-1-14
 * @Description :
 * @Point: Keep a good mood
 **/
public class Audi extends VehicleControlModel {

    @Override
    protected void startEngine() {

        System.out.println("奥迪   启动发动机");
    }

    @Override
    protected void shutDownEngine() {
        System.out.println("奥迪  关闭发动机");
    }

    @Override
    protected void openAC() {
        System.out.println("奥迪  空调开启");
    }

    @Override
    protected void closeAC() {
        System.out.println("奥迪  空调关闭");
    }


}

第二辆车:

/**
 * @Author : JCccc
 * @CreateTime : 2019-1-14
 * @Description :
 * @Point: Keep a good mood
 **/
public class BMW extends VehicleControlModel {

    @Override
    protected void startEngine() {
        System.out.println("宝马  启动发动机              ");
    }

    @Override
    protected void shutDownEngine() {
        System.out.println("宝马  关闭发动机              ");
    }

    @Override
    protected void openAC() {
        System.out.println("宝马  空调开启");
    }

    @Override
    protected void closeAC() {
        System.out.println("宝马  空调关闭");
    }

}

第三辆车:

/**
 * @Author : JCccc
 * @CreateTime : 2019-1-14
 * @Description :
 * @Point: Keep a good mood
 **/
public class Yamaha  extends   VehicleControlModel{

    @Override
    protected void startEngine() {
        System.out.println("雅马哈  启动发动机");
    }

    @Override
    protected void shutDownEngine() {
        System.out.println("雅马哈  关闭发动机");
    }

    @Override
    protected void openAC() {
        System.out.println("雅马哈  空调开启");
    }

    @Override
    protected void closeAC() {
        System.out.println("雅马哈  空调关闭");
    }

}

 好了,模板模式大体已经完成了。可以看到,我们先是根据不同车都能进行远程控制这个一个特性,抽离出来,建了一个抽象类(也就是指令控制模板);然后再是创建不同的车对应类去继承该模板,然后重写模板里面的方法。

可能到此,你可能还是没有发现这个模板模式有啥好的,那么我们继续看看怎么调用:

我们创建一个测试类,ControlClient.java :

/**
 * @Author : JCccc
 * @CreateTime : 2019-1-14
 * @Description :
 * @Point: Keep a good mood
 **/
public class ControlClient {


    public static void main(String[] args) {
        VehicleControlModel Audi_car=new Audi();
        Audi_car.excet();

        VehicleControlModel BWM_car=new BMW();
        BWM_car.excet();

        VehicleControlModel Yamaha_car=new Yamaha();
        Yamaha_car.excet();
    }



}

可以从代码里发现,我们是通过模板创建不同的车,指向对应车的类。

然后统一调用模板里面的统一车控方法,再通过this去指向的类去找不同的车自己继承模板重写的实现方法。

好了,模板设计模式的应用简要介绍就到此了,可以理解后自己再扩展下。

相关文章:

  • Springboot 最简单的结合MYSQL数据实现EXCEL表格导出及数据导入
  • Springboot中使用GSON报错 An attempt was made to call the method com.google.gson.GsonBuilder.setLenient
  • IDEA @AutoWired注入bean 出现红色波浪线
  • JAVA 最常用实用的正则表达式校验
  • Springboot 整合WebFlux 实现RESTFUI风格API 及简单的CRUD
  • Springboot 读取配置文件application.properties (yml)的四种方式
  • Springboot 指定获取自己写的配置properties文件的值
  • JAVA AES加密解密工具类
  • Springboot 快速了解 事务回滚@Transactional
  • Springboot Mybatis使用pageHelper实现分页查询
  • JAVA 雪花算法 唯一ID生成工具类
  • 灵魂的拷问 怎么将代码写得让人无法维护?
  • 灵魂的拷问 Hashtable的命名
  • 运行ElasticSearch报错:uncaught exception in thread [main] org.elasticsearch.bootstrap.StartupException
  • JAVA 8 Stream 常用操作
  • #Java异常处理
  • [译]Python中的类属性与实例属性的区别
  • 【mysql】环境安装、服务启动、密码设置
  • 11111111
  • 2017年终总结、随想
  • egg(89)--egg之redis的发布和订阅
  • Fundebug计费标准解释:事件数是如何定义的?
  • Java-详解HashMap
  • Js基础——数据类型之Null和Undefined
  • NSTimer学习笔记
  • React Transition Group -- Transition 组件
  • redis学习笔记(三):列表、集合、有序集合
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • v-if和v-for连用出现的问题
  • Vue2.x学习三:事件处理生命周期钩子
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 规范化安全开发 KOA 手脚架
  • 检测对象或数组
  • 简析gRPC client 连接管理
  • 使用 QuickBI 搭建酷炫可视化分析
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 提醒我喝水chrome插件开发指南
  • 回归生活:清理微信公众号
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​用户画像从0到100的构建思路
  • # 飞书APP集成平台-数字化落地
  • #{} 和 ${}区别
  • #NOIP 2014# day.2 T2 寻找道路
  • #pragma multi_compile #pragma shader_feature
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (52)只出现一次的数字III
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (论文阅读11/100)Fast R-CNN
  • (十六)一篇文章学会Java的常用API
  • (五)关系数据库标准语言SQL
  • (转)视频码率,帧率和分辨率的联系与区别
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版