根據參數值的不同,調用不同實現類

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章