设计模式-署理 模式使用教程

[复制链接]
查看320 | 回复0 | 2024-3-4 16:20:31 | 显示全部楼层 |阅读模式
在 Java 中实现署理 模式通常包含 两种方法 :静态署理 和动态署理 。静态署理 是在编译时就已经确定署理 类和真实对象的关系,而动态署理 则是在运行时动态生成署理 类。下面,我会分别  解释如何在项目中实践这两种署理 模式。
静态署理


  • 界说 接口:首先界说 一个接口,声明你想要署理 的办法 。
1public interface IService {2    void serve();3}

  • 实现接口:创建  一个真实对象类,实现上述接口。
1public class RealService implements IService {2    @Override3    public void serve() {4        System.out.println("Serving something important...");5    }6}

  • 创建  署理 类:然后创建  一个署理 类,同样实现这个接口,并在内部持有一个真实对象的引用,署理 类可以在挪用 真实对象的办法 前后添加额外的逻辑。
1                public class ProxyService implements IService {2    private IService realService;34    public ProxyService(IService realService) {5        this.realService = realService;6    }78    @Override9    public void serve() {10        System.out.println("Proxy before serving...");11        realService.serve();12        System.out.println("Proxy after serving...");13    }14}

  • 使用署理 :在客户端代码中,使用署理 类来替代真实对象。
1                public class Client {2    public static void main(String[] args) {3        IService realService = new RealService();4        IService proxyService = new ProxyService(realService);5        6        proxyService.serve();7    }8}动态署理

在Java中,动态署理 通常是通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现的。

  • 界说 接口:这一步和静态署理 相同,你需要一个接口。
1public interface IService {2    void serve();3}

  • 实现接口:创建  真实对象类,实现接口。
1public class RealService implements IService {2    @Override3    public void serve() {4        System.out.println("Serving something important...");5    }6}

  • 创建  挪用 处理  器:创建  一个InvocationHandler,它界说 了署理 实例的挪用 处理  法度模范   。
1public class ProxyInvocationHandler implements InvocationHandler {2    private Object target;34    public ProxyInvocationHandler(Object target) {5        this.target = target;6    }78    @Override9    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {10        System.out.println("Invoking method: " + method.getName());11        Object result = method.invoke(target, args);12        System.out.println("Method executed: " + method.getName());13        return result;14    }15}

  • 使用动态署理 :在客户端代码中,创建  真实对象的署理 实例,并通过它挪用 办法 。
1public class Client {2    public static void main(String[] args) {3        IService realService = new RealService();4        IService proxyService = (IService) Proxy.newProxyInstance(5            realService.getClass().getClassLoader(),6            new Class[] { IService.class },7            new ProxyInvocationHandler(realService)8        );9        10        proxyService.serve();11    }12}在上面的动态署理 例子中,Proxy.newProxyInstance办法 创建  了一个实现了IService接口的署理 实例,所有对该署理 实例的办法 挪用 都邑 被转发到ProxyInvocationHandler.invoke办法 。
这些是署理 模式在Java项目中的基本实践。在实际的项目中,署理 模式经常 用于拜访 控制、懒加载、日志记录、性能计数、事务处理  等场景。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

5

主题

4

回帖

33

积分

新手上路

Rank: 1

积分
33