博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
根据参数值的不同,调用不同实现类
阅读量:4036 次
发布时间:2019-05-24

本文共 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/

你可能感兴趣的文章
excel 查找一个表的数据在另一个表中是否存在
查看>>
centos 7 上配置dnsmasq 同时支持ipv4和ipv6的DHCP服务
查看>>
AsyncTask、View.post(Runnable)、ViewTreeObserver三种方式总结frame animation自动启动
查看>>
Android中AsyncTask的简单用法
查看>>
S3C6410启动模式介绍
查看>>
S3C2440 USB 设备控制器(转)
查看>>
Linux usb 设备驱动 (1)
查看>>
解决跨网场景下,CAS重定向无法登录的问题(无需修改现有代码)
查看>>
java反编译命令
查看>>
activemq依赖包获取
查看>>
概念区别
查看>>
关于静态块、静态属性、构造块、构造方法的执行顺序
查看>>
final 的作用
查看>>
在Idea中使用Eclipse编译器
查看>>
idea讲web项目部署到tomcat,热部署
查看>>
JMeter 保持sessionId
查看>>
IDEA Properties中文unicode转码问题
查看>>
Idea下安装Lombok插件
查看>>
zookeeper
查看>>
Idea导入的工程看不到src等代码
查看>>