对项目中先写接口再写实现类方式的思考

问题:
在浏览之前别人做的项目时会发现别人的业务层和持久层基本都是先写接口在写实现类,恨不能理解的时直接写实现类的好了呀,为什么还要多此一举的写接口在写实现类?

动态代理引发的思考

//**接口**
public interface IUserManager {

    public boolean addUserInfo(UserInfo userInfo) throws Exception;

    public boolean delUserInfo(int id) throws Exception;

    public boolean modifyUserInfo(UserInfo userInfo, int id) throws Exception;

    public UserInfo queryUserbyId(int id) throws Exception;
}

//实现类
public class UserManagerImpl implements IUserManager {


    public boolean addUserInfo(UserInfo userInfo) throws Exception {
        System.out.println("=========UserManagerImpl.addUserInfo()=========");
        return false;
    }

    public boolean delUserInfo(int id) throws Exception {
        System.out.println("=========UserManagerImpl.delUserInfo()=========");
        return false;
    }

    public boolean modifyUserInfo(UserInfo userInfo, int id) throws Exception {
        System.out.println("=========UserManagerImpl.modifyUserInfo()=========");
        return false;
    }

    public UserInfo queryUserbyId(int id) throws Exception {
        System.out.println("=========UserManagerImpl.queryUserbyId()=========");
        return null;
    }
}

以上类就是我们项目中遇见的项目中一层的方式,那么有什么好处呢?
动态代理

public class Client {
    public static void checkSecurity(){
        System.out.println("=============checkSecurity()==============");
    }

        public static void main(String[] args) throws Exception {
            final IUserManager iUserManager1 = new UserManagerImpl();
            IUserManager iUserManager = (IUserManager) Proxy.newProxyInstance(iUserManager1.getClass().getClassLoader(),
                iUserManager1.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object resultObj = null;
                        try {
                            if (method.getName().equals("addUserInfo")){
                                resultObj = method.invoke(iUserManager1,args);
                            }else {
                                checkSecurity();
                                resultObj =  method.invoke(iUserManager1,args);
                            }
                        }catch (Exception ex){
                            ex.printStackTrace();
                        }
                        return resultObj;
                    }
                });
            iUserManager.addUserInfo(new UserInfo());
            iUserManager.delUserInfo(1);
            iUserManager.modifyUserInfo(new UserInfo(),1);
            iUserManager.queryUserbyId(1);
         }
}

在经过动态代理后,我们的方法就会得到一定程度的增强,这是我们通过jdk来是实现的动态代理,要求就是被代理对象必须实现一个接口,这大概也就是为什么项目中先写接口在写实现类的原因吧

注: 第三方库cglib可以不需要被代理类实现接口

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值