• 回调方法?钩子方法?模板模式?


    背景:在讲到模板模式时候说到钩子方法,不是很理解,做个记录!

    彻底搞懂模板模式

    抽象方法和空实现方法的区别,当要实例化对象调用的使用时候,抽象方法必须实现,空方法可以不用重写

    模板模式是父类提供模板方法,子类提供具体实现,对于子类需要实现的方法,父类写成抽象方法,强制子类实现,对于子类不需要实现的方法,所有子类相同的方法,父类设计为空实现

    模板方法中具体方法到底是空实现还是抽象方法本身没有什么区别,只是为了设计优美,让子类只实现自己需要的抽象方法,仅仅设计优美而已

    模板模式两要素:父类的模板方法(注意,模板方法一定要放在父类并完全实现,并对子类可见 protected 或者 public)+子类实现具体方法

    模板模式可以不需要回调方法和钩子方法
    模板模式与回调方法关系:无关,也可以有关,见下面
    模板模式与钩子方法关系:无关,也可以有关,见下面

    彻底搞懂回调方法

    回调方法的定义:通过传递引用来调用引用指定对象的方法,回调方法一定涉及两个类,通过方法参数接收另外一个类的引用来调用另外一个类的方法

    回调方法就是一个通过回调对象的引用(java中的引用存的是对象的地址)调用的方法。如果你把回调对象的引用(地址)作参数传递给另一个方法,当这个引用被用来调用其所指向的方法时,我们就说这是回调方法。

    回调方法和钩子方法关系:无关,可以有关,见下面
    回调方法和模板模式关系:无关(模板模式可以不需要回调方法)也可以有关,比如加上Restaurant类,其方法中回调client的模板方法

     彻底搞懂钩子方法

    钩子方法的定义:通过一个方法来干涉另一个方法的行为,就是一个方法的返回结果或修改的变量是另一个方法执行时的if判断条件或for/while循环调用条件的

    钩子方法和回调用方法的关系:无关,回调方法涉及两个类,钩子方法可以完成只需要一个类,一个类中方法关联,一个类中一个方法的返回结果或修改的变量是另一个方法执行时的if判断条件或for/while循环调用条件的;

    也可以有关,就是,当一个类中的方法的判断条件是另外一个类中的方法提供的时候,参数和类变量就要提供另外一个类的引用了,静态方法则不必,所有还是可以有关的。

    钩子方法与模板模式的关系:无关,也可以有关,模板模式只是父类提供模板方法,子类实现具体方法(一些方法也可以父类实现)和钩子无关

    当某个方法的判断条件需要子类方法提供或父类方法提供的话,就是用到钩子了

    其中,最常见的是,父类方法需要子类实现作为判断条件,就是子类控制父类行为,这是模板方法中最常见的情况

    钩子方法的模拟和实际

    钩子方法是啥
    钩子顾名思义就是用来挂东西的。那么要挂东西必须有个被挂的东西,要不就是铁环、要不就是墙的边沿。所以要能挂住东西必须要有个被勾住的铁环,要一个钩子。那么在java中也是同样的原理,你首先需要一个被挂在的东西,一个挂载的东西。

    钩子的实现方法

    是对于抽象方法或者接口中定义的方法的一个空实现,在实际中的应用,比如说有一个接口,这个接口里有7个方法,而你只想用其中一个方法,那么这时,你可以写一个抽象类实现这个接口,在这个抽象类里将你要用的那个方法设置为abstract,其它方法进行空实现,然后你再继承这个抽象类,就不需要实现其它不用的方法,这就是钩子方法的作用。

    抽象父类

    public abstract class AbstractClass {
    
        public abstract boolean isOpen();
    
        public final void operating() {
            if(isOpen()) {
                System.out.println("钩子方法开启");
            }else {
                System.out.println("钩子方法关闭");
            }
        }
    }

    实现类

    public class AchieveClass extends AbstractClass {
    
      //钩子方法能挂在到operating能干预到operating业务逻辑
        @Override
        public boolean isOpen() {
            return true;
        }
    
        public static void main(String[] args) {
            AchieveClass ac = new AchieveClass();
            ac.operating();
        }
    
    }

    只要重写isOpen就能干预父类方法的业务流程。相当于将isOpen挂载在了父类的operating()中。

  • 相关阅读:
    我在ZZ这八年
    安装JBpm
    用程序实现HTTP压缩和缓存
    (转)WPF Custom Control Dependency Property Gotcha
    开发一个Word的代码高亮插件
    (转)Getting rid of the DSL model explorer
    (翻译)LearnVSXNow! #16 创建简单的编辑器2
    对 COM 组件的调用返回了错误 HRESULT E_FAIL。
    Word中使用代码高亮插件
    使用HttpWebRequest post数据时要注意UrlEncode
  • 原文地址:https://www.cnblogs.com/lixuwu/p/14652453.html
Copyright © 2020-2023  润新知