设计模式(二)模板方法

it2023-01-12  53

Thread t = new Thread("browseNews"){ @Override public void run() { System.out.println(Thread.currentThread().getName()); try { Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } } }; t.start();

观察自己写的代码,发现自己写的是t.start(); 实际是run方法被执行。这一定是java内部调用了run方法。查看具体源码,确实如此,调用了native 方法,里面调用了run方法。 问题1:这用了什么设计模式?写个例子模拟? 解决1: 例子:西红柿炒鸡蛋,这套流程就是倒油、放鸡蛋、放西红柿。将他们抽取出来,作为一个固定的炒菜模板方法。 具体代码

package com.bjsxt.chapter02; /** * 模板方法类 * @author whl * @date 2020/10/20 */ public abstract class Cook { abstract void oil(); abstract void egg(); abstract void tomato(); // 加final.避免被重写覆盖,就像线程的native方法不能被覆盖 public final void cook(){ this.oil(); this.egg(); this.tomato(); } } package com.bjsxt.chapter02; /** * 具体类 * @author whl * @date 2020/10/20 */ public class Me extends Cook { @Override void oil() { System.out.println("自己:油放多了!"); } @Override void egg() { System.out.println("自己:鸡蛋炒糊了!"); } @Override void tomato() { System.out.println("自己:西红柿放多了!"); } } package com.bjsxt.chapter02; /** * 具体类 * @author whl * @date 2020/10/20 */ public class Chef extends Cook{ @Override void oil() { System.out.println("厨师:油适量!"); } @Override void egg() { System.out.println("厨师:鸡蛋适量!"); } @Override void tomato() { System.out.println("厨师:西红柿适量!"); } } package com.bjsxt.chapter02; /** * @author whl * @date 2020/10/20 */ public class Test { public static void main(String[] args) { new Me().cook(); new Chef().cook(); } }

运行结果 问题2:怎么才能随心所欲,不加 油? 解决2:使用“钩子函数” 代码

package com.bjsxt.chapter03; /** * 模板方法类 * @author whl * @date 2020/10/20 */ public abstract class Cook { // 钩子函数,让子类决定是否可以加油 boolean isAddOil(){ return true; } abstract void oil(); abstract void egg(); abstract void tomato(); public final void cook(){ if(this.isAddOil()) { this.oil(); } this.egg(); this.tomato(); } } package com.bjsxt.chapter03; import com.bjsxt.chapter03.Cook; /** * 具体类 * @author whl * @date 2020/10/20 */ public class Me extends Cook { private boolean isAddOilFlag = true;// 默认加油 软编码 public boolean isAddOilFlag() { return isAddOilFlag; } public void setAddOilFlag(boolean addOilFlag) { isAddOilFlag = addOilFlag; } @Override boolean isAddOil() { //return false;// 我不加油 硬编码 return this.isAddOilFlag; } @Override void oil() { System.out.println("自己:油放多了!"); } @Override void egg() { System.out.println("自己:鸡蛋炒糊了!"); } @Override void tomato() { System.out.println("自己:西红柿放多了!"); } } package com.bjsxt.chapter03; import com.bjsxt.chapter03.Cook; /** * 具体类 * @author whl * @date 2020/10/20 */ public class Chef extends Cook{ @Override void oil() { System.out.println("厨师:油适量!"); } @Override void egg() { System.out.println("厨师:鸡蛋适量!"); } @Override void tomato() { System.out.println("厨师:西红柿适量!"); } } package com.bjsxt.chapter03; /** * @author whl * @date 2020/10/20 */ public class Test { public static void main(String[] args) { Me me = new Me(); me.setAddOilFlag(false); me.cook(); new Chef().cook(); } }

运行结果: 我设置不加油 发现好文章,还对比了优缺点 https://blog.csdn.net/qq_36090463/article/details/81981942?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.channel_param

最新回复(0)