前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java常用静态代理模式

Java常用静态代理模式

原创
作者头像
用户7999227
修改2021-10-08 15:04:08
3490
修改2021-10-08 15:04:08
举报
文章被收录于专栏:Java小王子Java小王子

 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。 关键:在编译期确定代理对象,在程序运行前代理类的.class文件就已经存在了。   比如:在代理对象中直接用new实例化被代理对象,或者将被代理对象传入代理对象的构造方法。

例子:   模拟保存动作,定义一个保存动作的接口:IUserDao.java,然后目标对象UserDao.java实现这个接口的方法,此时如果使用静态代理方式,就需要在代理对象(UserDaoProxy.java)中也实现IUserDao接口,调用的时候通过调用代理对象的方法来调用目标对象。

接口:IUserDao.java

代码语言:javascript
复制
    public interface IUserDao {
        void save();
    }

目标对象类:UserDao.java

代码语言:javascript
复制
    public class UserDao implements IUserDao {
        public void save() {
            System.out.println("----已经保存数据!----");
        }
    }

代理对象:UserDaoProxy.java

代码语言:javascript
复制
    public class UserDaoProxy implements IUserDao{
        //接收保存目标对象
        private IUserDao target;
        public UserDaoProxy(IUserDao target){
            this.target=target;
        }

        public void save() {
            System.out.println("开始事务...");
            target.save();//执行目标对象的方法
            System.out.println("提交事务...");
        }
    }

测试类:App.java

代码语言:javascript
复制
    public class App {
        public static void main(String[] args) {
            //目标对象
            UserDao target = new UserDao();
    
            //代理对象,把目标对象传给代理对象,建立代理关系
            UserDaoProxy proxy = new UserDaoProxy(target);
    
            proxy.save();//执行的是代理的方法
        }
    }
静态代理总结:

优点:   可以做到在不修改目标对象的功能前提下,对目标功能扩展。 缺点:   代理类和委托类实现相同的接口,同时要实现相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 静态代理总结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档