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

设计模式--3.模板方法模式

   

1.模版方法模式
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得一个子类可以不改变一个算法的结构,即可重新定义该算法的某些特定步骤。
模版方法模式使用的java中的继承机制,抽像类叫做抽像模版, 它的方法分为两类
(1) 基本方法:由子类实现的方法,并且在模板方法中被调用
(2)模板方法:可以有一个或几个(即一个框架),实现对基本方法的调用,完成固定的逻辑。
为了防止恶意的操作,一般模板方法都加上final关键字,不允许被重写。

2.在抽象类中,有一个isAlarm方法,模版方法根据其返回值决定是否要响喇叭,该方法影响了模版方法的执行结果,该方法就叫钩子方法(Hook Method)

3.优点
(1)封装不变部分,扩展可变部分
(2)提取公共代码,便于维护
(3)行为由父类控制,子类实现

4.缺点
(1)子类的执行结果影响到父类,影响代码可读性。

5.使用场景
(1)多个子类有公有方法,并且逻辑基本相同
(2)重要、复杂的算法,可以把核心部分设计成模板方法,周边相关功能和细节由子类实现。

 

 

AbstractCar类

public abstract class AbstractCar {
    protected abstract void start();
    protected abstract void stop();
    protected abstract void alarm();
    protected boolean isAlarm(){
        return false;
    }
    
    final public void run(){
        this.start();
        if(this.isAlarm()){
            this.alarm();
        }
        
        this.stop();
    }
}

奥迪类

public class AodiCar extends AbstractCar {

    @Override
    protected void start() {
        System.out.println("aodi start ...");

    }

    @Override
    protected void stop() {
        System.out.println("aodi stop ...");

    }

    @Override
    protected void alarm() {
        System.out.println("aodi alarm ...");
    }

    @Override
    protected boolean isAlarm(){
        return false;
    }
     
}

宝马类

/*
 * isAlarm是一个实现方法。 其作用是模板方法根据其返回值决定是否要响
    喇叭, 子类可以覆写该返回值
 */
public class BaoMaCar extends AbstractCar {
    private boolean alarmFlag = false;

    @Override
    protected void start() {
        System.out.println("baoma car start....");

    }

    @Override
    protected void stop() {
        System.out.println("baoma car stop ...");

    }

    @Override
    protected void alarm() {
        System.out.println("baoma car alarm ...");

    }
    
    protected boolean isAlarm(){
        return this.alarmFlag;
    }
     
    public void setAlarmFlag(boolean flagTmp){
        this.alarmFlag = flagTmp;
    }

}

场景类,Main

public class Main {
    
    public static void main(String[] args) {
        BaoMaCar bm = new BaoMaCar();
        bm.setAlarmFlag(true);
        bm.run();
        
        AodiCar ac = new AodiCar();
        ac.run();
    }
}

 

转载于:https://www.cnblogs.com/fubaizhaizhuren/p/5656224.html

相关文章:

  • 实现JSP数据和JavaScript数据交互使用
  • 使用Apache Xerces解析XML文档
  • 禁ping以及清理系统多余账号说明
  • 使用dom4j和XPath解析XML之例子二
  • [改善Java代码]子列表只是原列表的一个视图
  • 使用Java自带SAX工具解析XML
  • 使用SAX解析XML (控制台程序)
  • PMI列子1
  • 一个简单实用的AJAX例子
  • VS使用技巧
  • 一个最简单的AJAX实例及解析
  • 静态库中有图片,改如何存放呢??
  • 用Java结合SAX 2.0 解析XML文档
  • HDU 2594 Simpsons’ Hidden Talents(辛普森一家的潜在天赋)
  • 在Dom4j中使用xpath
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 3.7、@ResponseBody 和 @RestController
  • 4个实用的微服务测试策略
  • CAP 一致性协议及应用解析
  • export和import的用法总结
  • in typeof instanceof ===这些运算符有什么作用
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Javascript 原型链
  • Laravel Mix运行时关于es2015报错解决方案
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 从零开始在ubuntu上搭建node开发环境
  • 高性能JavaScript阅读简记(三)
  • 如何实现 font-size 的响应式
  • 什么软件可以剪辑音乐?
  • 使用Swoole加速Laravel(正式环境中)
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​flutter 代码混淆
  • ​第20课 在Android Native开发中加入新的C++类
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #git 撤消对文件的更改
  • #pragma 指令
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (BFS)hdoj2377-Bus Pass
  • (js)循环条件满足时终止循环
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (区间dp) (经典例题) 石子合并
  • (三)c52学习之旅-点亮LED灯
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .Net Winform开发笔记(一)
  • .Net 路由处理厉害了
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET项目中存在多个web.config文件时的加载顺序
  • 。Net下Windows服务程序开发疑惑
  • /etc/skel 目录作用
  • ::前边啥也没有
  • @private @protected @public