zoukankan      html  css  js  c++  java
  • 设计模式模板方法模式

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

    抽象类的父类,父类中定义了基本方法,模板方法和钩子方法。

    基本方法:父类中定义,在子类中实现。

    模板方法:父类中实现,调用基本方法,子类继承。

    钩子方法:在父类中定义,变相的实现父类调用子类的方法。

    具体例子如下:

    父类:

     1 package pattern.templateMethod;
     2 
     3 public abstract class HummerModel {
     4 
     5     // 基本方法
     6     protected abstract void start();
     7 
     8     // 基本方法
     9     protected abstract void stop();
    10 
    11     // 基本方法
    12     protected abstract void alarm();
    13 
    14     // 基本方法
    15     protected abstract void engineBoom();
    16 
    17     // 模板方法
    18     protected void run() {
    19         this.start();
    20         this.engineBoom();
    21         if (this.isAlarm()) {
    22             this.alarm();
    23         }
    24         this.stop();
    25     }
    26 
    27     // 钩子方法
    28     protected boolean isAlarm() {
    29         return true;
    30     }
    31 
    32 }

    子类1:

     1 package pattern.templateMethod;
     2 
     3 public class HummerH1Model extends HummerModel {
     4 
     5     private boolean alarmFlag = true;
     6     
     7     @Override
     8     protected void start() {
     9 
    10         System.out.println("H1 start....");
    11     }
    12 
    13     @Override
    14     protected void stop() {
    15         System.out.println("H1 stop.....");
    16     }
    17 
    18     @Override
    19     protected void alarm() {
    20         System.out.println("H1 alarm.....");
    21     }
    22 
    23     @Override
    24     protected void engineBoom() {
    25         System.out.println("H1 engineBoom");
    26     }
    27     
    28     @Override
    29     protected boolean isAlarm() {
    30         return this.alarmFlag;
    31     }
    32     
    33     public void setAlarm(boolean isAlarm){
    34         this.alarmFlag = isAlarm;
    35     }
    36 
    37 
    38 }

    子类2:

    package pattern.templateMethod;
    
    public class HummerH2Model extends HummerModel {
    
        @Override
        protected void start() {
    
            System.out.println("H2 start....");
        }
    
        @Override
        protected void stop() {
            System.out.println("H2 stop.....");
        }
    
        @Override
        protected void alarm() {
            System.out.println("H2 alarm.....");
        }
    
        @Override
        protected void engineBoom() {
            System.out.println("H2 engineBoom");
        }
    
    
    }

    alarm方法是否调用由子类中的setAlarm决定,实现了在父类中调用子类的方法。

  • 相关阅读:
    opencv7-ml之KNN
    opencv7-ml之统计模型
    计算机视觉-sift(2)代码理解
    计算机视觉-sift(1)原理
    PRML2-概率分布
    如何高效的通过BP算法来训练CNN
    CPP2-基础部分(1)
    PRML5-神经网络(2)
    《机器学习系统设计》(2)
    《机器学习系统设计》(1)
  • 原文地址:https://www.cnblogs.com/maple92/p/6670595.html
Copyright © 2011-2022 走看看