设计模式之模板方法模式(TemplateMethod)

模板方法模式是一种行为设计模式,它在抽象类中定义了一个算法的框架,允许子类在不改变整体结构的情况下重定义某些步骤。本文通过代码示例展示了如何在Java中实现模板方法模式,并提到了其在JVM类加载器中的应用。自定义类加载器通过继承ClassLoader并重写findClass方法,这就是模板方法模式的一个实例。
摘要由CSDN通过智能技术生成

设计模式之模板方法模式

模板方法模式

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

代码实现

package com.cyc.design.template;
public class Main {
    public static void main(String[] args) {
        F f = new C1();
//        f.op1();
        f.m();
    }
}

abstract class F {

    //在m方法中明确的调用了op1,op2, 这两个方法就是交给子类去实现的
    public void m() {
        op1();
        op2();
    }

    abstract void op1();

    abstract void op2();
}

/**
 * c1继承抽象类F, 从而去实现定义好的op1和op2方法
 */
class C1 extends F{

    @Override
    void op1() {
        System.out.println("op1");
    }

    @Override
    void op2() {
        System.out.println("op2");
    }
}

模式的应用

jvm的classLoader

先看代码

public class TemplateTest {
    public static void main(String[] args) throws ClassNotFoundException {
        //加载指定目录下的class类, 并输出他的完整类名
        Class clazz = TemplateTest.class.getClassLoader().loadClass("com.cyc.design.strategy.Cat");
        System.out.println(clazz.getName());
    }
}

查看源码

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

因此 , 自定义ClassLoader类加载器, 只需继承抽象类ClassLoader, 重写findClass方法即可, 这里用到的就是模板方法模式

示例代码如下

public class T006_ClassLoader extends ClassLoader {

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        File f = new File("c:/test/", name.replace(".", "/").concat(".class"));
        try {
            FileInputStream fis = new FileInputStream(f);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int b = 0;

            while ((b=fis.read()) !=0) {
                baos.write(b);
            }

            byte[] bytes = baos.toByteArray();
            baos.close();
            fis.close();//可以写的更加严谨

            return defineClass(name, bytes, 0, bytes.length);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.findClass(name); //throws ClassNotFoundException
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

意田天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值