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