本文共 2517 字,大约阅读时间需要 8 分钟。
最近的业务跟口碑关联比较紧密,为了支持客户定制化的要求,有些内容留了扩展口,口碑的团队同学帮我们定义了一些模板类,然后通过实现类传入不同的参数实现不同的功能。其底层的实现源码没有看过,但是类似的功能在dubbo里面也有很多。实际上也是一种钩子方法。
出于兴趣,自己根据需求实现了个简单的功能:
传入"cat"实现猫叫, 传入"dog"实现狗叫。在此贴一下源码:
1、先创建一个抽象的模板类,子类通过实现抽象的方法,并且子类对象调用doSpeak方法,即可实现子类的不同功能。实现类的命名要求必须是传入参数名+ServiceImpl。
public abstract class BaseClass{ private String index; public String getIndex() { return index; } public void setIndex(String index) { this.index = index; } public void speak(){ openMonth(); scream(); shutup(); } public abstract void openMonth(); public abstract void scream(); public abstract void shutup(); public void doSpeak(){ String className = index.substring(0,1).toUpperCase()+index.substring(1)+"ServiceImpl"; System.out.println("className="+className); String basePath = BaseClass.class.getResource("").getPath().replace(BaseClass.class.getResource("/").getPath(),""); basePath = basePath.replace("/","."); String classPath = basePath+className; try { Class clazz = (Class ) Class.forName(classPath); BaseClass o = clazz.newInstance(); o.speak(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } }}
2、创建个抽象类的公共子类,便于公共对象实例化
public class MyBaseClass extends BaseClass { @Override public void openMonth() { } @Override public void scream() { } @Override public void shutup() { }}
3、创建具体的实现类,继承公共子类,重写公共类方法
创建一个猫的实现类
public class CatServiceImpl extends MyBaseClass { @Override public void openMonth() { System.out.println("猫张开嘴!"); } @Override public void scream() { System.out.println("猫发出声音,喵喵喵"); } @Override public void shutup() { System.out.println("猫闭上嘴巴!"); }}
创建一个狗的实现类
public class DogServiceImpl extends MyBaseClass{ @Override public void openMonth() { System.out.println("狗张开嘴!"); } @Override public void scream() { System.out.println("狗发出声音,汪汪汪"); } @Override public void shutup() { System.out.println("狗闭上嘴巴!"); }}
4、测试:
public class TestClass { public static void main(String[] args) { BaseClass bc = new MyBaseClass(); //创建公共模板的对象 bc.setIndex("cat");//传入猫 bc.doSpeak();//实现猫叫 bc.setIndex("dog");//传入狗 bc.doSpeak();//实现狗叫 }}
转载地址:http://rmcdi.baihongyu.com/