设计模式(二)模板方法

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值