全国加盟网站大全,摄影网站的市场可行性,外贸展示型模板网站模板,郑州做网站哪家最好目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明
1.代理模式#xff08;Proxy Pattern#xff09;。2.意图#xff1a;为其他对象提供一种代理以控制对这个对象的访问。3.通过提供与对象相同的接口来控制对这个对象的访问。4.是设计模… 目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明
1.代理模式Proxy Pattern。2.意图为其他对象提供一种代理以控制对这个对象的访问。3.通过提供与对象相同的接口来控制对这个对象的访问。4.是设计模式中的一种结构型模式。5.创建了一个代表其他对象的代理对象从而可以在不修改原始对象的基础上控制访问和附加操作。
2. 应用场景
1.远程代理Remote Proxy为一个位于不同的地址空间的对象提供一个本地的代理对象这个不同的地址空间可以是同一台主机中的不同程序也可以是网络上的不同主机。2.虚拟代理Virtual Proxy根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。3.保护代理Protect or Access Control Proxy控制对原始对象的访问。4.智能引用Smart Reference Proxy当访问一个对象时代理可以自动地处理一些附加操作如访问统计、安全检查等。
3. 结构图 4. 构成
1.代理Proxy角色保存一个引用使得代理可以访问实体;提供一个与 Subiect 的接口相同的接口使代理可以用来代替实体;控制对实体的存取并可能负责创建和删除它;其他功能依赖于代理的类型:Remote Proxy负责对请求及其参数进行编码并向不同地址空间中的实体发送已编码的请求;Virtual Proxy 可以缓存实体的附加信息以便延迟对它的访问;Protection Proxy 检查调用者是否具有实现一个请求所必需的访问权限。持有一个真实对象的引用负责代理真实对象并在真实对象处理前或处理后进行附加操作。2.抽象主题Subject角色定义 RealSubject 和 Proxy 的共用接口这样就在任何使用 RealSubject 的地方都可以使用 Proxy。3.真实主题Real Subject角色定义 Proxy 所代表的实体。
5. 适用性
1.Proxy 模式适用于在需要比较通用和复杂的对象指针代替简单的指针的时候。2.远程代理(Remote Proxy)为一个对象在不同地址空间提供局部代表。3.虚代理(Virtual Proxy)根据需要创建开销很大的对象。4.保护代理(Protection Proxy)控制对原始对象的访问用于对象应该有不同的访问权限的时候。5.智能引用(Smart Reference)取代了简单的指针它在访问对象时执行一些附加操作。典型用途包括:对指向实际对象的引用计数这样当该对象没有引用时可以被自动释放;当第一次引用一个持久对象时将它装入内存;在访问一个实际对象前检查是否已经锁定了它以确保其他对象不能改变它。
6. 优点
1.职责清晰真实对象只关注业务逻辑代理对象只关注非业务逻辑。2.高扩展性可以在不修改真实对象的前提下扩展功能。3.智能化代理对象可以在客户端和目标对象之间起到中介的作用并且可以通过代理对象对目标对象进行封装和控制。
7. 缺点
1.代理类和委托类实现相同的接口增加了额外的编程工作量和复杂性。2.对于静态代理如果接口增加方法则代理类和目标类都需要进行修改增加了代码的维护成本。
8. java示例
1.卖票抽象主题角色
package com.learning.proxy;/*** 抽象主题角色*/
interface TicketSubject {void buyTicket(String userId);
}2.卖票真实主题角色
package com.learning.proxy;/*** 真实主题角色*/
class RealTicketSubject implements TicketSubject {Override public void buyTicket(String userId) {System.out.println(用户: userId 买票中);}
}3.代理角色
package com.learning.proxy;/*** 代理模式代理类*/
public class ProxyTicket implements TicketSubject {private RealTicketSubject realTicketSubject;public ProxyTicket(RealTicketSubject realTicketSubject) {this.realTicketSubject realTicketSubject;} Override public void buyTicket(String userId) {// 前置条件检查例如验证用户权限 if (!isUserAuthorized(userId)) { System.out.println(用户userId无购票权限);return; } // 记录日志 System.out.println(用户 userId 准备买票);// 调用真实票务服务购票realTicketSubject.buyTicket(userId);// 记录日志System.out.println(用户 userId 买票成功);// 购票后的处理如发送通知等 sendPurchaseNotification(userId);} private boolean isUserAuthorized(String userId) { return userId.startsWith(VIP);} private void sendPurchaseNotification(String userId) {System.out.println(用户 userId已购票成功);}
}4.客户端
package com.learning.proxy;public class Client {public static void main(String[] args) { RealTicketSubject realTicketSubject new RealTicketSubject();ProxyTicket proxyTicket new ProxyTicket(realTicketSubject);// 模拟用户购票 proxyTicket.buyTicket(VIP123);proxyTicket.buyTicket(NORMAL456);}
}7.示例截图