最近的業務跟口碑關聯比較緊密,爲了支持客戶定製化的要求,有些內容留了擴展口,口碑的團隊同學幫我們定義了一些模板類,然後通過實現類傳入不同的參數實現不同的功能。其底層的實現源碼沒有看過,但是類似的功能在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<? extends BaseClass> clazz = (Class<? extends BaseClass>) 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();//實現狗叫 } }