设计模式之(七)-----模板方法模式

2023-11-08

我先设计个类图:

 

非常简单的实现,你要悍马模型,我就给你悍马模型,先写个抽象类,然后两个不同型号的模型实现类,那我们把这个程序实现出来:

HummerModel抽象类的程序清单如下:

 

[java]  view plain copy print ?
  1. package template.method.pattern;  
  2. /** 
  3.  * 是悍马车辆模型的意思,不是悍马美女车模 
  4.  */  
  5. public abstract class HummerModel {  
  6.     ///首先,这个模型要能够被发动起来,别管是手摇发动,还是电力发动,反正是要能够发动起来,那这个实现要在实现类里了  
  7.     public abstract void start();  
  8.     //能发动,那还要能停下来,那才是真本事  
  9.     public abstract void stop();  
  10.     //喇叭会出声音,是滴滴叫,还是哔哔叫  
  11.     public abstract void alarm();  
  12.     //引擎会轰隆隆的响,不响那是假的  
  13.     public abstract void engineBoom();  
  14.     //那模型应该会跑吧,别管是人推的,还是电力驱动,总之要会跑  
  15.     public abstract void run();  
  16. }  

H1型号悍马的定义如下:

[java]  view plain copy print ?
  1. package template.method.pattern;  
  2. /** 
  3.  * 悍马车是每个越野者的最爱,其中H1最接近军用系列 
  4.  */  
  5. public class HummerH1Model extends HummerModel {  
  6.     public void alarm() {  
  7.         System.out.println("悍马H1鸣笛...");  
  8.     }  
  9.     public void engineBoom() {  
  10.         System.out.println("悍马H1引擎声音是这样在...");  
  11.     }  
  12.     public void start() {  
  13.         System.out.println("悍马H1发动...");  
  14.     }  
  15.     public void stop() {  
  16.         System.out.println("悍马H1停车...");  
  17.     }  
  18.     //这个方法是很有意思的,它要跑,那肯定要启动,停止了等,也就是要调其他方法  
  19.     public void run() {  
  20.         //先发动汽车  
  21.         this.start();  
  22.         //引擎开始轰鸣  
  23.         this.engineBoom();  
  24.         //然后就开始跑了,跑的过程中遇到一条狗挡路,就按喇叭  
  25.         this.alarm();  
  26.         //到达目的地就停车  
  27.         this.stop();  
  28.     }  
  29. }  

 

然后看悍马H2型号的实现:

 

[java]  view plain copy print ?
  1. package template.method.pattern;  
  2. /** 
  3.  * H1和H2有什么差别,还真不知道,真没接触过悍马 
  4.  */  
  5. public class HummerH2Model extends HummerModel {  
  6.     public void alarm() {  
  7.         System.out.println("悍马H2鸣笛...");  
  8.     }  
  9.     public void engineBoom() {  
  10.         System.out.println("悍马H2引擎声音是这样在...");  
  11.     }  
  12.     public void start() {  
  13.         System.out.println("悍马H2发动...");  
  14.     }  
  15.     public void stop() {  
  16.         System.out.println("悍马H2停车...");  
  17.     }  
  18.     //H2要跑,那肯定要启动,停止了等,也就是要调其他方法  
  19.     public void run() {  
  20.         //先发动汽车  
  21.         this.start();  
  22.         //引擎开始轰鸣  
  23.         this.engineBoom();  
  24.         //然后就开始跑了,跑的过程中遇到一条狗挡路,就按喇叭  
  25.         this.alarm();  
  26.         //到达目的地就停车  
  27.         this.stop();  
  28.     }  
  29. }  

然后程序写到这里,你就看到问题了,run方法的实现应该在抽象类上,不应该在实现类上,好,我们修改一下类图和实现:

就把run方法放到了抽象类中,那代码也相应的改变一下,先看HummerModel.java:

[java]  view plain copy print ?
  1. package template.method.pattern;  
  2. /** 
  3.  * 是悍马车辆模型的意思,不是悍马美女车模 
  4.  */  
  5. public abstract class HummerModel {  
  6.     ///首先,这个模型要能够被发动起来,别管是手摇发动,还是电力发动,反正是要能够发动起来,那这个实现要在实现类里了  
  7.     public abstract void start();  
  8.     //能发动,那还要能停下来,那才是真本事  
  9.     public abstract void stop();  
  10.     //喇叭会出声音,是滴滴叫,还是哔哔叫  
  11.     public abstract void alarm();  
  12.     //引擎会轰隆隆的响,不响那是假的  
  13.     public abstract void engineBoom();  
  14.     //那模型应该会跑吧,别管是人退的,还是电力驱动,总之要会跑  
  15.     public void run() {  
  16.         //先发动汽车  
  17.         this.start();  
  18.         //引擎开始轰鸣  
  19.         this.engineBoom();  
  20.         //然后就开始跑了,跑的过程中遇到一条狗挡路,就按喇叭  
  21.         this.alarm();  
  22.         //到达目的地就停车  
  23.         this.stop();  
  24.     }  
  25. }  

下面是HummerH1Model.java程序清单:

[java]  view plain copy print ?
  1. package template.method.pattern;  
  2. /** 
  3.  * 悍马车是每个越野者的最爱,其中H1最接近军用系列 
  4.  */  
  5. public class HummerH1Model extends HummerModel {  
  6.     public void alarm() {  
  7.         System.out.println("悍马H1鸣笛...");  
  8.     }  
  9.     public void engineBoom() {  
  10.         System.out.println("悍马H1引擎声音是这样在...");  
  11.     }  
  12.     public void start() {  
  13.         System.out.println("悍马H1发动...");  
  14.     }  
  15.     public void stop() {  
  16.         System.out.println("悍马H1停车...");  
  17.     }  
  18. }  

下面是HummerH2Model.java的程序清单:

[java]  view plain copy print ?
  1. package template.method.pattern;  
  2. /** 
  3.  * H1和H2有什么差别,还真不知道,真没接触过悍马 
  4.  */  
  5. public class HummerH2Model extends HummerModel {  
  6.     public void alarm() {  
  7.         System.out.println("悍马H2鸣笛...");  
  8.     }  
  9.     public void engineBoom() {  
  10.         System.out.println("悍马H2引擎声音是这样在...");  
  11.     }  
  12.     public void start() {  
  13.         System.out.println("悍马H2发动...");  
  14.     }  
  15.     public void stop() {  
  16.         System.out.println("悍马H2停车...");  
  17.     }  
  18. }  

类图修改完毕了,程序也该好了,提交给老大,老大一看,挺好,就开始生产了,并提交给客户使用了,那客户是如何使用的呢?类图上增加一个Client类,就是客户,我们这个是用main函数来代替他使用,类图如下:

然后看增加的Client.java程序,非常的简单:

[java]  view plain copy print ?
  1. package template.method.pattern;  
  2. /** 
  3.  * 客户开始使用这个模型 
  4.  */  
  5. public class Client {  
  6.     public static void main(String[] args) {  
  7.         //客户开着H1型号,出去遛弯了  
  8.         HummerModel h1 = new HummerH1Model();  
  9.         h1.run(); //汽车跑起来了;  
  10.         //客户开H2型号,出去玩耍了  
  11.         HummerModel h2 = new HummerH2Model();  
  12.         h2.run();  
  13.     }  
  14. }  

非常非常的简单,那如果我告诉这就是模板方法模式你会不会很不屑呢?就这模式,太简单了,我一直在使用呀,是的,你经常在使用,但你不知道这是模板方法模式,那些所谓的高手就可以很牛X的说“用模板方法模式就可以实现…”,你还要很崇拜的看着,哇,牛人,模板方法模式是什么呀?

然后我们继续回顾我们这个模型,回头一想,不对呀,需求分析的有点问题,客户要关心模型的启动,停止,鸣笛,引擎声音吗?他只要在run的过程中,听到或看都成了呀,暴露那么多的方法干啥?好了,我们重新修改一下类图:

 

把抽象类上的四个方法设置为protected访问权限,好了,既然客户不关心这几个方法,而且这四个方法都是由子类来实现的,那就设置成protected模式。咦~,那还有个缺陷,run方法既然子类都不修改,那是不是可以设置成final类型呢?是滴是滴,类图如下:

好了,这才是模板方法模式,就是这个样子,我们只要修改抽象类代码就可以了,HummerModel.java程序清单如下:

[java]  view plain copy print ?
  1. package template.method.pattern;  
  2. /** 
  3.  * 是悍马车辆模型的意思,不是悍马美女车模 
  4.  */  
  5. public abstract class HummerModel {  
  6.     ///首先,这个模型要能够被发动起来,别管是手摇发动,还是电力发动,反正是要能够发动起来,那这个实现要在实现类里了  
  7.     protected abstract void start();  
  8.     //能发动,那还要能停下来,那才是真本事  
  9.     protected abstract void stop();  
  10.     //喇叭会出声音,是滴滴叫,还是哔哔叫  
  11.     protected abstract void alarm();  
  12.     //引擎会轰隆隆的响,不响那是假的  
  13.     protected abstract void engineBoom();  
  14.     //那模型应该会跑吧,别管是人退的,还是电力驱动,总之要会跑  
  15.     final public void run() {  
  16.         //先发动汽车  
  17.         this.start();  
  18.         //引擎开始轰鸣  
  19.         this.engineBoom();  
  20.         //然后就开始跑了,跑的过程中遇到一条狗挡路,就按喇叭  
  21.         this.alarm();  
  22.         //到达目的地就停车  
  23.         this.stop();  
  24.     }  
  25. }  

其他的子类都不用修改(如果要修改,就是把四个方法的访问权限由public修改protected),大家请看这个run方法,他定义了调用其他方法的顺序,并且子类是不能修改的,这个叫做模板方法;start、stop、alarm、engineBoom这四个方法是子类必须实现的,而且这四个方法的修改对应了不同的类,这个叫做基本方法,基本方法又分为三种:在抽象类中实现了的基本方法叫做具体方法;在抽象类中没有实现,在子类中实现了叫做抽象方法,我们这四个基本方法都是抽象方法,由子类来实现的;还有一种叫做钩子方法,这个等会讲。到目前为止,这两个模型都稳定的运行,突然有一天,老大又找到了我,“客户提出新要求了,那个喇叭想让它响就响,你看你设计的模型,车子一启动,喇叭就狂响,赶快修改一下”,确实是设计缺陷,呵呵,不过是我故意的,那我们怎么修改呢?看修改后的类图:

 

 增加一个方法,isAlarm(),喇嘛要不要响,这就是钩子方法(Hook Method),那我们只要修改一下抽象类就可以了:

[java]  view plain copy print ?
  1. package template.method.pattern;  
  2. /** 
  3.  * 是悍马车辆模型的意思,不是悍马美女车模 
  4.  */  
  5. public abstract class HummerModel {  
  6.     ///首先,这个模型要能够被发动起来,别管是手摇发动,还是电力发动,反正是要能够发动起来,那这个实现要在实现类里了  
  7.     protected abstract void start();  
  8.     //能发动,那还要能停下来,那才是真本事  
  9.     protected abstract void stop();  
  10.     //喇叭会出声音,是滴滴叫,还是哔哔叫  
  11.     protected abstract void alarm();  
  12.     //引擎会轰隆隆的响,不响那是假的  
  13.     protected abstract void engineBoom();  
  14.     //那模型应该会跑吧,别管是人退的,还是电力驱动,总之要会跑  
  15.     final public void run() {  
  16.         //先发动汽车  
  17.         this.start();  
  18.         //引擎开始轰鸣  
  19.         this.engineBoom();  
  20.         //然后就开始跑了,跑的过程中遇到一条狗挡路,就按喇叭  
  21.         if(this.isAlarm()){  
  22.             this.alarm();  
  23.         }  
  24.         //到达目的地就停车  
  25.         this.stop();  
  26.     }  
  27.     //钩子方法,默认喇叭是会响的  
  28.     protected boolean isAlarm(){  
  29.         return true;  
  30.     }  
  31. }  

钩子方法模式是由抽象类来实现的,子类可以重写的,H2型号的悍马是不会叫的,喇叭是个摆设,看HummerH2Model.java代码:

 

[java]  view plain copy print ?
  1. package template.method.pattern;  
  2. /** 
  3.  * H1和H2有什么差别,还真不知道,真没接触过悍马 
  4.  */  
  5. public class HummerH2Model extends HummerModel {  
  6.     public void alarm() {  
  7.         System.out.println("悍马H2鸣笛...");  
  8.     }  
  9.     public void engineBoom() {  
  10.         System.out.println("悍马H2引擎声音是这样在...");  
  11.     }  
  12.     public void start() {  
  13.         System.out.println("悍马H2发动...");  
  14.     }  
  15.     public void stop() {  
  16.         System.out.println("悍马H2停车...");  
  17.     }  
  18.     //默认没有喇叭的  
  19.     protected boolean isAlarm() {  
  20.         return false;  
  21.     }  
  22. }  

 

那H2型号的模型都没有喇叭,就是按了喇叭也没有声音,那客户端这边的调用没有任何修改,出来的结果就不同,我们先看Client.java程序:

 

[java]  view plain copy print ?
  1. package template.method.pattern;  
  2. /** 
  3.  * 客户开始使用这个模型 
  4.  */  
  5. public class Client {  
  6.     public static void main(String[] args) {  
  7.         HummerH2Model h2 = new HummerH2Model();  
  8.         h2.run(); //H2型号的悍马跑起来  
  9.     }  
  10. }  

那H1又有所不同了,它的喇叭要不要响是由客户来决定,其实在类图上已经标明了setAlarm这个方法,我们看HummerH1Model.java的代码:

[java]  view plain copy print ?
  1. package template.method.pattern;  
  2. /** 
  3.  * 悍马车是每个越野者的最爱,其中H1最接近军用系列 
  4.  */  
  5. public class HummerH1Model extends HummerModel {  
  6.     private boolean alarmFlag = true//是否要响喇叭  
  7.     public void alarm() {  
  8.         System.out.println("悍马H1鸣笛...");  
  9.     }  
  10.     public void engineBoom() {  
  11.         System.out.println("悍马H1引擎声音是这样在...");  
  12.     }  
  13.     public void start() {  
  14.         System.out.println("悍马H1发动...");  
  15.     }  
  16.     public void stop() {  
  17.         System.out.println("悍马H1停车...");  
  18.     }  
  19.     protected boolean isAlarm() {  
  20.         return this.alarmFlag;  
  21.     }  
  22.     //要不要响喇叭,是有客户的来决定的  
  23.     public void setAlarm(boolean isAlarm){  
  24.         this.alarmFlag = isAlarm;  
  25.     }  
  26. }  

 

这段代码呢修改了两个地方,一是重写了父类的isAlarm()方法,一是增加了一个setAlarm方法,由调用者去决定是否要这个功能,也就是喇叭要不要滴滴答答的响,哈哈,那我们看看Client.java的修改:

 

[java]  view plain copy print ?
  1. package template.method.pattern;  
  2. /** 
  3.  * 客户开始使用这个模型 
  4.  */  
  5. public class Client {  
  6.     public static void main(String[] args) {  
  7.         //客户开着H1型号,出去遛弯了  
  8.         HummerH1Model h1 = new HummerH1Model();  
  9.         h1.setAlarm(true);  
  10.         h1.run(); //汽车跑起来了;  
  11.     }  
  12. }  

看到没,这个模型run起来就有声音了,那当然把h1.setAlarm(false)运行起来喇叭就没有声音了,钩子方法的作用就是这样滴。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式之(七)-----模板方法模式 的相关文章

  • C++设计模式(8)——命令模式

    命令模式 亦称 动作 事务 Action Transaction Command 意图 命令模式是一种行为设计模式 它可将请求转换为一个包含与请求相关的所有信息的独立对象 该转换让你能根据不同的请求将方法参数化 延迟请求执行或将其放入队列中
  • python语法(高阶)-设计模式(单例模式)

    参考内容 黑马程序员
  • C++ 装饰器模式

    什么是装饰器模式 装饰器模式是一种结构型设计模式 实现了在不改变现有对象结构的的同时又拓展了新的功能 装饰器本质上是对现有对象的重新包装 同时装饰器又称为封装器 如何理解装饰器模式 以笔记本电脑为例 当我们购买了一台新笔记本电脑 但我们发现
  • C++设计模式(二)观察者模式

    1 观察者模式知识点 1 定义 定义对象间的一种一对多的依赖关系 当一个对象的状态发生改变的时候 所有依赖它的对象都得到通知并自动更新 2 动机 将一个系统分割成一系列相互协作的类有一个常见的副作用 需要维护相关对象间的一致性 我们不希望为
  • 小谈设计模式(1)—总序

    小谈设计模式 1 总序 专栏地址 开始操作 设计模式总论 设计模式是什么 组成要素 模式名称 问题描述 解决方案 效果描述 设计模式有什么作用 提供可重用的解决方案 提高代码的可读性和可维护性 促进代码的可扩展性 提高代码的灵活性和可重用性
  • java需会(转载)

    一 基础篇 1 1 Java基础 面向对象的特征 继承 封装和多态 final finally finalize 的区别 Exception Error 运行时异常与一般异常有何异同 请写出5种常见到的runtime exception i
  • 计算资源合并模式——云计算架构常用设计模式

    背景 云计算的解决方案中 最初设计可能有意遵循关注点分离的设计原则 把操作分解为独立的计算单元以便可以单独托管和部署 然而 虽然这种策略可以帮助简化解决方案的逻辑实现 但是在同一个应用程序中要部署大量的计算单元 这会增加运行时的托管成本 并
  • C++设计模式-State状态模式

    State状态模式作用 当一个对象的内在状态改变时允许改变其行为 这个对象看起来像是改变了其类 UML图如下 State类 抽象状态类 定义一个接口以封装与Context的一个特定状态相关的行为 ConcreteState类 具体状态 每一
  • 设计模式学习之装饰器模式

    装饰器 Decorator 模式跟适配器 Adapter 模式一样 属于构建型设计模式 在学习适配器模式的时候说过 适配器模式的重点在复用能力 装饰器模式的重点在扩展能力 换言之 装饰器模式是先复用后扩展 这也导致了很多人跟适配器模式混淆
  • 程杰“大话设计模式”中的设计原则

    单一职责原则 SRP 就一个类而言 应该仅有一个引起它变化的原因 如果一个类承担的职责过多 就等于把这些职责耦合在了一起 一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力 这种耦合会导致脆弱的设计 当发生变化时 设计会遭受到意想不到
  • 设计模式--Abstract server模式 VS Adapter 模式

    适配器类似于现实世界里面的插头 通过适配器 我们可以将分属于不同类的两种不同类型的数据整合起来 而不必去根据某一需要增加或者修改类里面的方法 Adapter mode和Proxymode的区别 Proxy的关注点是职能转移 通过引入Prox
  • 设计模式-建造者模式

    文章目录 建造者模式 创建复杂对象的优雅方式 什么是建造者模式 建造者模式的使用场景 优缺点 示例 使用建造者模式创建电脑对象 建造者模式 创建复杂对象的优雅方式 在软件开发中 有时候我们需要创建具有复杂结构和多个组件的对象 直接在客户端代
  • 分享几个项目中用到的设计模式

    前言 之前项目中出于扩展性和有雅性的考虑 使用了多种设计模式进行项目框架的设计 主要的一些设计模式是单例模式 工厂模式 策略模式 责任链模式 代理模式这几种 现在依次讲讲这几个的主要是实现方式和在我们项目中的应用场景 核心设计模式分享 单例
  • HeadFirst 设计模式学习笔记10——MVC分析

    1 M V C Model View Controller 模式 视图 控制器 这是一种范型 模型对象正是应用系统存在的理由 你设计的对象 包含了数据 逻辑和其他在你的应用领域创建定制的类 视图通常是控件 用来显示和编辑 控制器位于二者中间
  • 设计模式之享元模式

    享元模式 就是共享技术 对于系统中存在大量相同的对象 把他们抽取成一个对象放在缓存中进行使用 这样可以大大节省系统资源 例如 围棋棋盘上有两种棋子 一个是黑子 一个是白子 如果在下棋的时候每下一个棋子就要new一个棋子对象 那么就会有大量的
  • java-IO流(5)-IO流中的设计模式(装饰器模式和适配器模式)的介绍

    目录 1装饰器模式 1 1定义 1 2代码实现 1 3装饰器特点 1 4装饰器在IO流中的使用 2配适器模式 2 1Adapter适配器 2 2代码实例 2 3适配器特点 2 4适配器优缺点 2 5适配器在IO中的使用 3装饰器与适配器异同
  • DDD专家张逸:构建领域驱动设计知识体系

    张逸 读完需要 5分钟 速读仅需 2 分钟 领域驱动设计专家 曾就职于 ThoughtWorks 作为 Lead Consultant 为客户提供架构设计 大数据分析 持续交付 代码质量 敏捷管理等咨询服务 著译作包括 软件设计精要与模式
  • 二十四种设计模式之策略模式

    一 什么是策略模式 简单来说 策略模式是将每一个算法封装到拥有共同接口的不同类中 使得算法可以在不影响客户端的情况下发生变化 也可以理解为可供程序运行时选择的 不同的类 不同的解决方案 策略模式的特点 高内聚低耦合 可扩展 遵循ocp原则
  • 设计模式详解---策略模式

    1 策略模式简介 策略模式 Strategy Pattern 是一种行为型设计模式 用于在运行时根据不同的情境选择不同的算法或策略 该模式将算法封装成独立的类 使得它们可以相互替换 而且可以独立于客户端使用它们的方式 1 1 主要角色 上下
  • 2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式

    微服务彻底改变了应用程序开发世界 将大型整体系统分解为更小 更易于管理的组件 这种架构风格的特点是独立 松散耦合的服务 带来了从可扩展性 模块化到更高的灵活性等众多优势 DevOps 团队如何最好地利用这种方法来实现最高效率 答案在于理解并

随机推荐

  • Qt应用开发(基础篇)——颜色选择器 QColorDialog

    一 前言 QColorDialog类继承于QDialog 是一个设计用来选择颜色的对话框部件 对话框窗口 QDialog QColorDialog颜色选择器一般用来让用户选择颜色 比如画图工具中选择画笔的颜色 刷子的颜色等 你可以使用静态函
  • 彻底卸载MySQL8.0

    环境需求 win10 MySQL8 0 彻底卸载 1 停止MySQL服务 启动任务管理器 gt 选择服务 gt 找到MySQL gt 右键停止 如果有多个MySQL服务 也全部都要停掉 2 卸载MySQL相关所有组件 打开看控制面板 gt
  • 使用树莓派进行远程视频转播(内网穿透)

    一 准备材料 实体 树莓派摄像头 树莓派 虚拟 云服务器 二 先测试树莓派进行局域网转播 这里是需要安装的软件 sudo apt get install subversion libjpeg8 dev imagemagick libv4l
  • 线性代数系列讲解第七篇 正交向量及正交空间

    正交向量 orthogonal vector 毕达哥拉斯定理 勾股定理 Pythagoras 我们很容易得出 x 2 y 2 x y 2 x 2 y 2 x y 2 x 2 y 2 x y 2 这就是勾股定理 我们可以将一个向量的模的平方写
  • 服务器改配项目,网络服务器搭建(项目五)[xxxx1214修改].ppt

    网络服务器搭建 项目五 xxxx1214修改 4 查看启动信息 service named restart 如果named服务无法正常启动 可以查看提示信息 根据提示信息更改配置文件 5 查看端口 如果服务正常工作 则会开启TCP和UDP的
  • 自动化测试:python测试结果和报告自动发送邮件

    一 带有附件发送邮件 1 导入模块 MIMEMultipart from email mime multipart import MIMEMultipart 复制 2 先读取要发送文件的内容 file new 是测试报告路径的参数名 3 下
  • Linux 动态库 soname 实践

    xredis 因为项目中使用到了 xredis C 开发的redis客户端 是对hiredis的C 封装 在 makefile 中发现使用到了 Wl soname 这个语法 之前没怎么了解过 特此记录 makefile 节选如下 XREDI
  • LeetCode—200.岛屿数量(Number of Islands)——分析及代码(C++)

    LeetCode 200 岛屿数量 Number of Islands 分析及代码 C 一 题目 二 分析及代码 1 深度优先搜索 1 思路 2 代码 3 结果 三 其他 一 题目 给定一个由 1 陆地 和 0 水 组成的的二维网格 计算岛
  • elementui确认消息区分取消和关闭按钮

    默认情况下 elementui的确认消息 取消按钮和右上角弹窗 走的是同一个方法 也就是catch方法的回调 如果功能上需要做区分 就没法区分了 所以 要解决这个问题 就需要在取消的回调方法里做一个判断 来区分是点击右上角的取消 还是点击的
  • 如何隐藏unity窗口中的变量、如何设置变量范围、在编辑器中如何显示私有变量与Awake、start之间的区别

    什么是脚本 cs的文本文件 类文件 附加到游戏物体中 定义游戏对象行为指令的代码 c 类包括 字段 属性 构造方法 方法 脚本文件包括 字段 方法 不能在脚本文件里写构造方法 一些unity脚本小属性 序列化字段 作用 在编辑器中显示私有变
  • 基于Matlab的BiLSTM实现

    问题背景 目前深度学习多使用python实现 不过想要配置好一个python的深度学习环境有时却并不轻松 常常因为各个第三方库版本兼容性问题而失败 相比之下 matlab仅需一次安装简化了不少工作 这几年matlab的深度学习工具箱也是发展
  • 高斯过程回归

    文章目录 效果一览 文章概述 研究内容 程序设计 参考资料 效果一览 文章概述 高斯过程回归 Matlab实现高斯过程回归多输入单输出预测 Gaussian Process Regression 研究内容 高斯过程回归 Gaussian P
  • OpenFeign 入门教程 - 基础篇

    目录 Spring Cloud OpenFeign 介绍 Feign 概述 Spring Cloud OpenFeign 概述 Spring Cloud OpenFeign 的特性 Feign 与 Spring Cloud OpenFeig
  • Centos7 linux 安装 redis 遇到的几个问题

    环境 centos7 redis 5 0 解决方案仅供参考 如不能解决问题 请查找请他方案 1 不能编译没有GCC 编译工具 make报错 make 1 persist settings Error 2 ignored CC adlist
  • DataX全量和增量mysqltomysql(二)

    全量mysqltomysql 进入目录编写json cd usr local datax job vi zabbixmysql2mysql json 写入的表结构要和reader的表结构一样 先建立好 编写json文件 job conten
  • Python爬虫学习笔记(一)————网页基础

    目录 1 网页的组成 2 HTML 1 标签 2 比较重要且常用的标签 列表标签 超链接标签 a标签 img标签 用于渲染 图片资源的标签 div标签和span标签 3 属性 4 常用的语义化标签 5 元素的分类及特点 块元素 行内元素 行
  • 企业微信开发(二)安全性全面升级

    参考地址 企业微信帐号ID安全性全面升级 接口文档 企业微信开发者中心 客户标签ID的转换 接口文档 企业微信开发者中心 涉及的ID有corpid userid external userid与unionid 标签ID 客户群成员 微信客户
  • C语言自定义类型详解(结构体+枚举+联合)

    目录 结构体 结构体的类型声明 结构体的内存对齐 位段 枚举 联合 共用体 结构体 结构体的类型声明 结构是一些值的集合 这些值称为成员变量 结构的每个成员可以是不同类型的变量 结构的声明 例如定义一个学生 typedef struct S
  • springboot 获取客户端IP地址方法

    在使用springboot时 需要获取访问客户端的IP地址 获取客户端IP地址 private String getIpAddress String ip request getHeader x forwarded for if ip nu
  • 设计模式之(七)-----模板方法模式

    我先设计个类图 非常简单的实现 你要悍马模型 我就给你悍马模型 先写个抽象类 然后两个不同型号的模型实现类 那我们把这个程序实现出来 HummerModel抽象类的程序清单如下 java view plain copy print pack