首页 > 其他分享 >代理模式:为其他对象提供一种代理以控制对这个对象的访问

代理模式:为其他对象提供一种代理以控制对这个对象的访问

时间:2023-06-08 13:55:29浏览次数:31  
标签:name 对象 代理 访问 UserService userService save public

代理模式是一种常见的设计模式,它允许一个对象在不改变其行为的情况下,控制对另一个对象的访问。代理模式通常用于保护敏感对象,或者为了延迟实际对象的加载。

在Java中,代理模式有两种形式:静态代理和动态代理。静态代理需要手动编写代理类,而动态代理则可以在运行时自动生成代理类。

示例代码:静态代理

public interface UserService {
    void save(String name);
}

public class UserServiceImpl implements UserService {
    @Override
    public void save(String name) {
        System.out.println("保存用户:" + name);
    }
}

public class UserServiceProxy implements UserService {
    private UserService userService;

    public UserServiceProxy(UserService userService) {
        this.userService = userService;
    }

    @Override
    public void save(String name) {
        System.out.println("开始事务");
        userService.save(name);
        System.out.println("提交事务");
    }
}

public class Test {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        UserService userServiceProxy = new UserServiceProxy(userService);
        userServiceProxy.save("张三");
    }
}

示例代码:动态代理

public interface UserService {
    void save(String name);
}

public class UserServiceImpl implements UserService {
    @Override
    public void save(String name) {
        System.out.println("保存用户:" + name);
    }
}

public class MyInvocationHandler implements InvocationHandler {
    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("开始事务");
        Object result = method.invoke(target, args);
        System.out.println("提交事务");
        return result;
    }
}

public class Test {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        MyInvocationHandler invocationHandler = new MyInvocationHandler(userService);
        UserService userServiceProxy = (UserService) Proxy.newProxyInstance(UserService.class.getClassLoader(),
                new Class[]{UserService.class}, invocationHandler);
        userServiceProxy.save("张三");
    }
}

动态代理是通过Java提供的Proxy类和InvocationHandler接口来实现的。相较于静态代理,动态代理更加灵活,因为它可以在运行时生成代理类,并且可以代理任何实现了接口的类,而不需要手动编写代理类。

标签:name,对象,代理,访问,UserService,userService,save,public
From: https://www.cnblogs.com/li053/p/17465385.html

相关文章

  • python中可变对象和不可变对象
    数据类型的操作一般分为三类:1、构造操作: 这类操作主要是基于一些已知信息,产生这个类的实例对象。类似银行进行开通账户 2、解析操作:这类操作是获取对象的一些有用信息,其结果反应了对象的一些特征,但返回的不是对象本身。类似银行查询账户余额  3、变化操作:这类操作是修改......
  • 面向过程与面向对象
                                               《目录》面向过程与面向对象C与C++ 的区别代码复用分层思想封装、继承、多态C语言实现封装       C语言实现继承C语言实现......
  • 2、客户端访问ZooKeeper--命令行客户端和图形化客户端访问
    客户端访问命令行客户端访问ZooKeeper安装zookeeper的bin里面,有命令行工具[root@ubuntu2004~]#ls/usr/local/zookeeper/bin/zkCli.sh/usr/local/zookeeper/bin/zkCli.sh里面存的脚本是由java运行起来的#可连接至zookeeper集群中的任意一台zookeeper节点进行以下操作,zkCli......
  • 对象和数字对象
    什么是对象如果你学过驾驶,八成被教练骂过吧?可能你的脑海中现在还回荡着教练粗暴的吼叫:踩离合器,档位杆推到1挡位置!!慢慢抬起脚,松离合器仔细分析上面的话,大家可以发现,我们的语言描述通常会涉及到对象:对象就是语言描述中涉及的物体。比如上面的离合器、档位杆,就是对......
  • 部署springboot项目到linux服务器,端口访问不了
    部署springboot项目到服务器,端口访问不了看一看之前有没有端口已经占用了ps-ef|grepjava 例如,8000,有项目已经在后台了(例如nohup设置springboot项目系统后台不挂断地运行命令)如果你的新项目的端口是8020或者8030也是不能使用的(这里是我遇到的问题)这时候关......
  • 使用 ADB 命令为 Windows Subsystem Android(WSA)配置代理
    注意!以下命令需在命令提示符中执行,不要使用PowerShell,会有字符错误!设置代理:adbconnect127.0.0.1:58526&&adbshell"settingsputglobalhttp_proxy`iproutelistmatch0tableallscopeglobal|cut-F3`:7890"中间一大段会自动识别宿主机ip注意修改7890端口......
  • 8.15 对象向下转型
    demo1在向下转型之前,必须先向上转型classPerson{publicvoidrun(){System.out.println("run.....");}}classSupermanextendsPerson{publicvoidfly(){System.out.println("超音速飞....");}publicvoidfire(){......
  • 拨号获取IP和HTTP代理有什么区别
    在网络通信中,IP地址和HTTP代理都扮演着非常重要的角色。而拨号获取IP与HTTP代理虽然都可以隐藏用户的真实IP地址,但是它们本质上有着很大的区别。下面我们来详细介绍一下他们的区别。一、拨号获取IP拨号获取IP,是指用户通过拨打互联网服务提供商(ISP)的电话线路,建立网络连......
  • 通过读取字节内容分析对象在内存中的布局
    在《如何计算一个实例占用多少内存?》中我们知道一个值类型或者引用类型的实例在内存中占多少字节。如果我们知道这段连续的字节序列的初始地址,我们就能够将代表该实例的字节内容读取出来。在接下来的内容中,我们将利用一个简单的方法输出指定实例的字节序列,并此次分析值类型和引用......
  • 8.14 对象向上转型
    对象向上转型(接收或返回参数的统一性)----开发中主要使用的技术classMessage{publicvoidprint(){System.out.println("www.mldn.cn");}}classDataBaseMessageextendsMessage{publicvoidprint(){System.out.println("oracle数据......