说说你对代理模式的理解?

1 个回答

  • java小生
    见过花就好,何必在意花属于谁。
    代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到了中介的作用。代理模式主要用来实现对目标对象的访问控制和增强功能。 ### 代理模式的优点 - **解耦**:代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。 - **功能扩展**:可以灵活地隐藏被代理对象的部分功能和服务,也可以增加额外的功能和服务。 - **控制访问**:可以控制对目标对象的访问,例如权限控制、访问控制等。 ### 代理模式的缺点 - **性能开销**:由于使用了代理模式,程序的性能可能会有所下降,特别是在频繁调用的场景下。 - **代码复杂度**:使用代理模式提高了代码的复杂度,增加了系统的维护难度。 ### 代理模式的应用场景 - **远程代理**:为一个对象在不同的地址空间提供局部代表。这种代理会隐藏一个对象存在于不同地址空间的事实。 - **虚代理**:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。 - **保护代理**:控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。 - **智能引用代理**:取代了简单的指针,它在访问对象时执行一些附加操作。智能引用代理用于在访问一个对象时,提供一些额外的操作。 ### 代理模式的实现 #### 静态代理 静态代理由程序员创建或特定工具自动生成源代码。在编译时,代理类和委托类绑定关系。 ```java public interface TicketService { void buyTicket(); } public class RealTicketService implements TicketService { @Override public void buyTicket() { System.out.println("Buying a ticket from the real service."); } } public class TicketServiceProxy implements TicketService { private RealTicketService realTicketService; public TicketServiceProxy(RealTicketService realTicketService) { this.realTicketService = realTicketService; } @Override public void buyTicket() { System.out.println("Proxy: Pre-processing before buying ticket."); realTicketService.buyTicket(); System.out.println("Proxy: Post-processing after buying ticket."); } } public class Client { public static void main(String[] args) { RealTicketService realTicketService = new RealTicketService(); TicketServiceProxy proxy = new TicketServiceProxy(realTicketService); proxy.buyTicket(); } } ``` #### 动态代理 动态代理类在程序运行时创建的代理模式。动态代理一般是通过反射机制来实现。 ```java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public interface TicketService { void buyTicket(); } public class RealTicketService implements TicketService { @Override public void buyTicket() { System.out.println("Buying a ticket from the real service."); } } public class TicketServiceInvocationHandler implements InvocationHandler { private Object realService; public TicketServiceInvocationHandler(Object realService) { this.realService = realService; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Proxy: Pre-processing before buying ticket."); Object result = method.invoke(realService, args); System.out.println("Proxy: Post-processing after buying ticket."); return result; } } public class Client { public static void main(String[] args) { RealTicketService realService = new RealTicketService(); TicketServiceInvocationHandler handler = new TicketServiceInvocationHandler(realService); TicketService proxy = (TicketService) Proxy.newProxyInstance( realService.getClass().getClassLoader(), realService.getClass().getInterfaces(), handler); proxy.buyTicket(); } } ``` ### 生活中的代理模式示例 - **黄牛卖火车票**:没有流行网络购票的年代,人们喜欢找黄牛买火车票。黄牛就是代理人,火车票就是被代理的对象。 - **婚姻介绍所**:婚姻介绍所的工作人员搜集单身人士信息并为他们找对象,婚介所的工作人员就是代理人,单身人士的信息就是被代理的对象。 ### 结论 代理模式在软件设计中是一个非常有用的模式,通过引入代理对象,可以在不修改原有对象代码的前提下,添加额外的功能和服务,同时也能更好地控制对目标对象的访问。
    发布于 2024-08-07 18:32 •IP属地 安徽
    举报
    评论
    收藏