模板方法-高级应用 hook(钩子)
2018-03-22 17:28
786 查看
模板方法模式入门:https://blog.csdn.net/dengjili/article/details/79631472
![](https://img-blog.csdn.net/20180322172934851?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RlbmdqaWxp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
加入hook,其中这个hook方法是可选的
给出例子,再给出解释
子类一,不重写hook方法
子类二,重写hook方法
测试代码
测试结果
结论,子类得出结论,hook钩子方法为子类留有选择的余地
其中isHook为钩子方法,因为它是决定是否调用括号中的代码,子类可以重写这个方法来决定
hook不是钩子方法,无法决定是否执行这段代码
测试
测试结果
![](https://img-blog.csdn.net/20180322174813997?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RlbmdqaWxp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
调用钩子方法paint
测试结果
修改设计
加入hook,其中这个hook方法是可选的
给出例子,再给出解释
package headfirst.hd.template.eg; public abstract class AbstractClass { //不让子类覆盖掉这个方法,声明为final类型 //父类定义程序执行模板 public final void templateMethod() { init(); privimitiveOperation1(); //可以是任意位置 doSomeThing(); privimitiveOperation2(); //可以是任意位置 destroy(); hook(); } //定义为保户类型,对外不可见这个方法 protected void hook() { //空实现,给子类留有可扩展的余地 } public void init() { System.out.println("这是父类一个初始化init方法,需要做很多事情"); } public void destroy() { System.out.println("这是父类一个初始化destroy方法,需要做很多事情\n"); } public void doSomeThing() { System.out.println("做很多事情"); } //一般抽象方法数据不是很多 public abstract void privimitiveOperation1(); public abstract void privimitiveOperation2(); }
子类一,不重写hook方法
package headfirst.hd.template.eg; public class ConcreteClass extends AbstractClass { @Override public void privimitiveOperation1() { System.out.println("类ConcreteClass,子类方法1,做了很多事情"); } @Override public void privimitiveOperation2() { System.out.println("类ConcreteClass,子类方法2,做了很多事情"); } }
子类二,重写hook方法
package headfirst.hd.template.eg; public class ConcreteClass2 extends AbstractClass { @Override public void privimitiveOperation1() { System.out.println("类ConcreteClass2,子类方法1,做了很多事情"); } @Override public void privimitiveOperation2() { System.out.println("类ConcreteClass2,子类方法2,做了很多事情"); } @Override protected void hook() { System.out.println("类ConcreteClass2,钩子方法,增加一些附加功能"); } }
测试代码
package headfirst.hd.template.eg; public class Client { //模板方法模式:定义程序执行流程,子类实现部分步骤 public static void main(String[] args) { AbstractClass temlate = new ConcreteClass(); temlate.templateMethod(); //更换第二个子类,程序执行流程不变 temlate = new ConcreteClass2(); temlate.templateMethod(); } }
测试结果
这是父类一个初始化init方法,需要做很多事情 类ConcreteClass,子类方法1,做了很多事情 做很多事情 类ConcreteClass,子类方法2,做了很多事情 这是父类一个初始化destroy方法,需要做很多事情 这是父类一个初始化init方法,需要做很多事情 类ConcreteClass2,子类方法1,做了很多事情 做很多事情 类ConcreteClass2,子类方法2,做了很多事情 这是父类一个初始化destroy方法,需要做很多事情 类ConcreteClass2,钩子方法,增加一些附加功能
结论,子类得出结论,hook钩子方法为子类留有选择的余地
钩子hook的其他的表现方式
public final void templateMethod() { init(); privimitiveOperation1(); //可以是任意位置 doSomeThing(); privimitiveOperation2(); //可以是任意位置 destroy(); if (isHook()) { hook(); } } private boolean isHook() { return false; } //定义为保户方法,对外不可见这个方法 protected void hook() { //空实现,给子类留有可扩展的余地 }
其中isHook为钩子方法,因为它是决定是否调用括号中的代码,子类可以重写这个方法来决定
hook不是钩子方法,无法决定是否执行这段代码
java钩子hook的应用JFrame的paint方法
例子package callback.other; import javax.swing.JFrame; public class TestFrame extends JFrame { private static final long serialVersionUID = 1L; public TestFrame() { super("钩子hook"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400,400); setVisible(true); } }
测试
package callback.other; public class MyFrame { public static void main(String[] args) { new TestFrame(); } }
测试结果
调用钩子方法paint
package callback.other; import java.awt.Graphics; import javax.swing.JFrame; public class TestFrame extends JFrame { private static final long serialVersionUID = 1L; public TestFrame() { super("钩子hook"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400,400); setVisible(true); } @Override public void paint(Graphics g) { super.paint(g); g.drawString("钩子重写方法", 180, 180); } }
测试结果
相关文章推荐
- 模板方法模式--钩子的应用
- 回调方法、模板方法模式、钩子(hook)区分
- 模板方法和Callback回调应用实践-自己动手写JdbcTemplate(附源码)
- 【DRP】——Servlet与模板方法模式的应用
- java设计模式之模板模式以及钩子方法使用
- 代码注入的三种方法 钩子(HOOK)
- destoon3.0 用户模板首页应用新模板无效不能立即刷新的解决方法
- Java设计模式应用——模板方法模式
- Cacti高级应用--打造自己的Cacti模板
- 侧边导航(高级搜索)应用到 $("xxxxx").click(function () {}点击某控件是触发的方法,
- Yii2创建高级应用模板+安装扩展
- 两个方法解决DZ(Discuz ! x3.2 )论坛安装模板不是正版应用的问题
- c++高级应用(模板)(STL)(模板嵌套)
- C++模板应用——让模板定义和实现分离的方法
- 电商平台学习笔记(七)——模板方法结合Spring在DAO层的应用
- Android源码学习之模板方法模式应用
- 抽象类应用——模板方法模式
- Java 设计模式之模板方法开发中应用
- php中钩子(hook)的应用示例演示与下载
- 设计模式在游戏中的应用--模板方法(七)