您的位置: 首页 - 站长

html5购物网站源码wordpress扁平模板下载

当前位置: 首页 > news >正文

html5购物网站源码,wordpress扁平模板下载,上海企业自助建站,西三旗网站建设深入理解设计模式之代理模式 在软件开发的复杂体系中#xff0c;我们常常会遇到这样的情况#xff1a;需要控制对某个对象的访问#xff0c;或者在访问对象前后添加一些额外的处理逻辑#xff0c;又或者希望在不改变原对象代码的基础上扩展其功能。代理模式#xff08;Pr…深入理解设计模式之代理模式 在软件开发的复杂体系中我们常常会遇到这样的情况需要控制对某个对象的访问或者在访问对象前后添加一些额外的处理逻辑又或者希望在不改变原对象代码的基础上扩展其功能。代理模式Proxy Pattern正是解决这些问题的有力工具作为一种结构型设计模式它在软件设计中扮演着重要的角色。 一、代理模式的定义 代理模式简单来说就是为其他对象提供一种代理以控制对这个对象的访问。在某些场景下一个对象可能由于各种原因如对象创建开销大、对象位于远程服务器等不适合或者不能直接被客户端引用而代理对象则可以在客户端和目标对象之间充当一个中介的角色客户端通过代理对象来间接访问目标对象 。这就好比我们在生活中通过房产中介来寻找合适的房子房产中介就是代理对象它帮助我们与房东目标对象进行沟通和协调控制我们对房东的访问同时也为我们提供了一些额外的服务如筛选房源、安排看房等。 二、代理模式的结构 代理模式主要包含以下三个核心角色 抽象主题Subject这是一个抽象类或接口它定义了真实主题和代理主题的共同接口使得在任何使用真实主题的地方都可以使用代理主题。在上述房产中介的例子中抽象主题可以是一个 “房屋租赁服务” 的接口定义了寻找房源、签订合同等方法。 真实主题RealSubject实现了抽象主题接口定义了真实对象所要实现的业务逻辑是代理对象所代表的真实对象。继续以上述例子来说房东就是真实主题他拥有房屋的所有权并负责提供房屋租赁的实际服务。 代理主题Proxy同样实现了抽象主题接口持有一个对真实主题的引用。它在客户端和真实主题之间起到中介作用控制对真实主题的访问并可以在访问真实主题前后添加一些额外的操作如权限验证、日志记录等。房产中介就是代理主题它持有房东的相关信息帮助租客与房东进行沟通和协调并在租赁过程中提供一些额外的服务如协助租客了解房屋周边环境、办理租赁手续等。 三、代理模式的类型 根据代理对象的创建时机和方式代理模式可以分为静态代理和动态代理 静态代理在编译期就已经确定代理类和目标类的关系代理类是手动编写的并且在程序运行前就已经存在。静态代理的优点是实现简单容易理解缺点是当需要代理多个不同的对象时需要编写多个代理类代码量较大维护起来比较困难。例如在一个电商系统中如果每个商品都需要一个代理类来进行库存检查和价格调整那么就需要编写大量的代理类。 动态代理在运行时通过反射机制动态地创建代理类代理类的创建不需要手动编写而是根据实际需求在运行时动态生成。动态代理的优点是可以灵活地代理多个不同的对象代码量较少维护方便缺点是实现相对复杂对反射机制的理解和运用要求较高。例如在一个权限管理系统中可以使用动态代理来为不同的业务方法添加权限验证功能根据用户的角色和权限动态地生成代理类。 四、代理模式的优缺点 优点 职责清晰真实主题专注于实现核心业务逻辑代理主题负责处理与访问控制、额外功能添加等相关的事务使得代码的职责更加清晰易于维护和扩展。比如在一个文件管理系统中文件读写操作由真实主题负责而权限验证、日志记录等功能由代理主题实现。 保护目标对象代理对象可以在客户端和目标对象之间起到中介的作用对客户端的访问进行控制和过滤从而保护目标对象不被非法访问或滥用。例如在一个数据库系统中通过代理对象可以限制用户对敏感数据的访问权限。 增强功能在不修改目标对象代码的前提下通过代理对象可以方便地为目标对象添加新的功能如日志记录、缓存、事务管理等。例如在一个网络请求系统中可以通过代理对象为请求添加缓存功能提高系统的性能。 延迟加载对于创建开销较大或者初始化耗时的对象可以使用代理对象来延迟对象的创建和初始化直到真正需要使用时才创建从而提高系统的性能和资源利用率。例如在一个图形绘制系统中对于复杂的图形对象可以使用代理对象来延迟其创建直到需要显示时才进行创建。
缺点 增加系统复杂度代理模式引入了代理对象增加了系统的抽象层次和复杂性特别是在动态代理的情况下由于涉及到反射机制代码的可读性和可维护性可能会受到一定的影响。 性能开销在通过代理对象访问目标对象时会增加一些额外的开销如方法调用的转发、反射操作等这可能会对系统的性能产生一定的影响尤其是在对性能要求较高的场景下需要谨慎使用。 接口一致性维护代理对象和目标对象需要实现相同的接口当接口发生变化时需要同时修改代理对象和目标对象的代码以保持接口的一致性这增加了代码维护的难度。
五、代理模式的应用场景 权限控制在访问某些敏感资源或执行某些关键操作之前通过代理对象检查用户的权限只有具有相应权限的用户才能访问或执行。例如在一个企业信息管理系统中对员工的工资查询、修改等操作可以通过代理对象进行权限验证只有人力资源部门的员工和相关领导才能进行这些操作。 远程代理在分布式系统中当需要访问远程服务器上的对象时可以使用远程代理来隐藏对象存在于不同地址空间的事实为远程对象提供一个本地代表。远程代理负责处理与远程对象的通信包括数据的序列化、传输和反序列化等操作使得客户端可以像访问本地对象一样访问远程对象。例如在一个电商系统中订单处理服务可能部署在远程服务器上客户端可以通过远程代理来调用订单处理服务而无需关心远程通信的细节。 虚拟代理对于创建开销大或者初始化耗时的对象可以使用虚拟代理来延迟对象的创建和初始化。虚拟代理在客户端请求时先返回一个简单的代理对象当真正需要使用目标对象时再创建并初始化目标对象。例如在一个图像浏览系统中对于大尺寸的图片可以使用虚拟代理来延迟图片的加载当用户需要查看图片时再加载图片提高系统的响应速度。 缓存代理在访问某些频繁使用且数据相对稳定的资源时可以使用缓存代理来缓存资源的结果当再次访问时直接从缓存中获取结果而无需重新获取或计算从而提高系统的性能。例如在一个新闻网站中对于热门新闻的内容可以使用缓存代理来缓存当用户再次访问时直接从缓存中获取新闻内容减少数据库的查询压力。 智能引用在对象被访问时通过代理对象执行一些额外的操作如记录对象的访问次数、检查对象的状态等。例如在一个数据库连接池系统中可以使用代理对象来记录每个数据库连接的使用次数当连接使用次数达到一定阈值时进行连接的回收或更新。 六、代理模式的代码示例 静态代理示例 首先定义抽象主题接口Subject // 抽象主题接口public interface Subject {void request();} 然后定义真实主题类RealSubject // 真实主题类public class RealSubject implements Subject {Overridepublic void request() {System.out.println(RealSubject: handling request.);}} 接着定义代理主题类Proxy // 代理主题类public class Proxy implements Subject {private RealSubject realSubject;public Proxy() {this.realSubject new RealSubject();}Overridepublic void request() {System.out.println(Proxy: before request.);realSubject.request();System.out.println(Proxy: after request.);}} 最后在客户端进行测试 public class Client {public static void main(String[] args) {Subject proxy new Proxy();proxy.request();}} 动态代理示例 首先定义抽象主题接口Subject和真实主题类RealSubject与静态代理示例相同。 然后定义代理处理器类InvocationHandlerImpl import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;// 代理处理器类public class InvocationHandlerImpl implements InvocationHandler {private Object target;public InvocationHandlerImpl(Object target) {this.target target;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(InvocationHandler: before method invocation.);Object result method.invoke(target, args);System.out.println(InvocationHandler: after method invocation.);return result;}} 最后在客户端进行测试 import java.lang.reflect.Proxy;public class Client {public static void main(String[] args) {RealSubject realSubject new RealSubject();Subject proxy (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),realSubject.getClass().getInterfaces(),new InvocationHandlerImpl(realSubject));proxy.request();}} 上述代码分别展示了静态代理和动态代理的实现方式通过代理模式可以在不修改真实主题类代码的基础上为其添加额外的功能并且可以灵活地控制对真实主题的访问。 通过对代理模式的深入了解我们可以看到它在软件设计中具有广泛的应用场景和强大的功能。在实际项目开发中合理运用代理模式能够使我们的代码更加灵活、可维护和可扩展提升软件系统的质量和开发效率。如果你对代理模式还有其他疑问比如在不同场景下如何选择合适的代理类型欢迎随时与我交流。