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

做网站浏览器标签一般放哪网站建设确认报告

做网站浏览器标签一般放哪,网站建设确认报告,wordpress 最简单皮肤,东莞软件开发培训机构代理模式:控制对象访问的中间层设计 一、模式核心:通过代理对象控制对目标对象的访问 在软件开发中,有时需要为对象添加一个 “代理” 来控制对它的访问,例如: 远程代理:访问远程对象时(如 R…

代理模式:控制对象访问的中间层设计

一、模式核心:通过代理对象控制对目标对象的访问

在软件开发中,有时需要为对象添加一个 “代理” 来控制对它的访问,例如:

  • 远程代理:访问远程对象时(如 RPC 调用),本地代理对象伪装成远程对象
  • 虚拟代理:延迟加载目标对象(如图片未加载时显示占位符)
  • 保护代理:控制对敏感对象的访问权限(如用户权限校验)

** 代理模式(Proxy Pattern)** 通过引入代理类,在不修改目标对象的前提下,为其添加额外的逻辑或控制访问,核心解决:

  • 访问控制:在目标对象访问前后添加预处理逻辑
  • 资源优化:延迟初始化昂贵的目标对象
  • 职责分离:将非业务逻辑(如日志、事务)从目标对象中剥离

核心思想与 UML 类图(PlantUML 语法)

代理模式包含目标接口(Subject)、目标对象(RealSubject)和代理对象(Proxy),代理对象与目标对象实现相同接口,客户端通过代理间接访问目标:

PlantUML Diagram

二、核心实现:虚拟代理实现图片延迟加载

1. 定义目标接口(图片)

public interface Image {void display(); // 显示图片
}

2. 实现真实主题(实际图片对象,加载耗时)

public class RealImage implements Image {private String fileName;public RealImage(String fileName) {this.fileName = fileName;loadFromDisk(fileName); // 模拟加载耗时操作}private void loadFromDisk(String fileName) {System.out.println("加载图片:" + fileName);try {Thread.sleep(1000); // 模拟IO延迟} catch (InterruptedException e) {e.printStackTrace();}}@Overridepublic void display() {System.out.println("显示图片:" + fileName);}
}

3. 实现代理对象(延迟加载,先显示占位符)

public class ImageProxy implements Image {private String fileName;private RealImage realImage; // 真实对象延迟初始化public ImageProxy(String fileName) {this.fileName = fileName;}@Overridepublic void display() {if (realImage == null) {System.out.println("显示占位符..."); // 前置处理realImage = new RealImage(fileName); // 首次调用时加载真实对象}realImage.display(); // 调用真实对象的显示方法System.out.println("记录访问日志:" + fileName); // 后置处理}
}

4. 客户端通过代理访问目标对象

public class ClientDemo {public static void main(String[] args) {// 使用代理对象,无需直接创建RealImageImage image = new ImageProxy("large_image.jpg");System.out.println("第一次显示图片:");image.display(); // 触发延迟加载System.out.println("\n第二次显示图片:");image.display(); // 直接使用缓存的RealImage}
}

输出结果

第一次显示图片:
显示占位符...
加载图片:large_image.jpg
显示图片:large_image.jpg
记录访问日志:large_image.jpg第二次显示图片:
显示图片:large_image.jpg
记录访问日志:large_image.jpg

三、进阶:实现分布式代理与动态代理

1. 远程代理(模拟 RPC 调用)

// 远程服务接口(目标接口)
public interface RemoteService {String process(String request);
}// 本地代理对象(伪装成远程服务)
public class RemoteServiceProxy implements RemoteService {private String serverUrl;public RemoteServiceProxy(String serverUrl) {this.serverUrl = serverUrl;}@Overridepublic String process(String request) {// 通过HTTP/Netty发送请求到远程服务器return sendRequestToServer(request);}private String sendRequestToServer(String request) {System.out.println("发送远程请求:" + request + " 到 " + serverUrl);// 实际实现需处理网络IO和序列化return "远程响应:" + request.toUpperCase();}
}

2. 动态代理(基于 Java 反射,无需手动编写代理类)

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// 动态代理处理器
public class DynamicProxyHandler implements InvocationHandler {private Object target; // 目标对象public DynamicProxyHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("动态代理前置处理:" + method.getName());Object result = method.invoke(target, args); // 调用目标对象方法System.out.println("动态代理后置处理:" + method.getName());return result;}
}// 创建动态代理示例
public class DynamicProxyDemo {public static void main(String[] args) {RealImage realImage = new RealImage("small_image.jpg");// 生成动态代理对象Image proxy = (Image) Proxy.newProxyInstance(Image.class.getClassLoader(),new Class<?>[] { Image.class },new DynamicProxyHandler(realImage));proxy.display(); // 通过代理调用目标方法}
}

3. 可视化代理流程

客户端请求
代理对象接收请求
代理执行前置逻辑
调用真实对象
真实对象处理请求
代理执行后置逻辑
返回结果给客户端

四、框架与源码中的代理模式实践

1. Spring AOP(动态代理实现切面编程)

  • 通过JdkDynamicAopProxyCglibAopProxy生成代理对象,织入切面逻辑
// 代理对象调用目标方法时,自动执行@Before、@After等增强
@Service
public class UserService {@Transactionalpublic void updateUser(User user) {// 业务逻辑}
}

2. MyBatis 映射器(Mapper Proxy)

  • MapperProxy作为代理对象,将接口方法映射为 SQL 语句执行
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User getUser(int id);
}// MyBatis创建MapperProxy代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUser(1); // 代理对象处理SQL执行

3. JavaScript 代理(Proxy 对象)

  • ES6 提供Proxy用于创建代理对象,拦截目标对象的操作
const realObject = { name: "Alice" };
const proxy = new Proxy(realObject, {get(target, property) {console.log(`访问属性:${property}`);return target[property];}
});
console.log(proxy.name); // 输出:访问属性:name  Alice

五、避坑指南:正确使用代理模式的 3 个要点

1. 区分代理与装饰器模式

  • 代理模式:代理对象控制对目标对象的访问(目标对象可能不存在或需控制访问)
  • 装饰器模式:装饰对象增强目标对象的功能(目标对象必须存在且功能需扩展)

2. 处理代理对象的线程安全

  • 若代理对象持有目标对象的引用,需确保多线程环境下的线程安全
public class ThreadSafeProxy implements Subject {private RealSubject realSubject = new RealSubject();private final Object lock = new Object();@Overridepublic void request() {synchronized (lock) {realSubject.request();}}
}

3. 避免代理链过长

  • 多层代理可能导致性能损耗和调试困难,建议:
    • 合并同类代理(如日志代理与权限代理合并为一个复合代理)
    • 使用 AOP 替代多层手动代理

4. 反模式:滥用代理导致复杂度上升

  • 对于简单的功能增强,直接修改目标对象可能更高效,无需引入代理

六、总结:何时该用代理模式?

适用场景核心特征典型案例
远程对象访问目标对象位于远程服务器,需通过网络调用RPC 框架、微服务客户端
延迟加载与缓存目标对象创建昂贵,需延迟初始化图片 / 视频加载、大文件处理
权限控制与日志记录需要在目标对象访问前后添加通用逻辑权限系统、事务管理、性能监控
接口伪装与隔离需要为复杂系统提供简单接口或伪装实现细节模拟对象(测试场景)、遗留系统适配

代理模式通过 “中间层控制 + 解耦访问” 的设计,为对象访问添加了灵活的控制层,是构建可扩展、易维护系统的重要模式。下一篇我们将深入探讨策略模式,解析如何动态切换算法实现,敬请期待!

扩展思考:静态代理 vs 动态代理

类型实现方式灵活性适用场景
静态代理手动编写代理类(编译期确定)低(代理类与目标类强绑定)简单场景、无需频繁修改代理逻辑
动态代理通过反射或字节码生成(运行时创建)高(可动态适配多个目标类)框架级代理(如 AOP、ORM)

理解这种差异,能帮助我们在不同场景下选择更合适的代理实现方式。


文章转载自:

http://gwBPHLEP.qnxtz.cn
http://DMY6aKxr.qnxtz.cn
http://eFoapSfj.qnxtz.cn
http://E2B3aR8W.qnxtz.cn
http://zQl36Seu.qnxtz.cn
http://Rs6OZE1M.qnxtz.cn
http://9JWTf8lw.qnxtz.cn
http://M0pMG4Fu.qnxtz.cn
http://KaSWOymT.qnxtz.cn
http://cDJc2cHF.qnxtz.cn
http://zDbMXdJY.qnxtz.cn
http://zWKx98Qs.qnxtz.cn
http://OnUzzWC9.qnxtz.cn
http://twRzwIO0.qnxtz.cn
http://O4sZlDTc.qnxtz.cn
http://LJ4GOSXG.qnxtz.cn
http://QhSdcmgp.qnxtz.cn
http://Yx9BlYd6.qnxtz.cn
http://Wd6Mb0oi.qnxtz.cn
http://W8rn3xx2.qnxtz.cn
http://yFPvE4li.qnxtz.cn
http://uouCgWhi.qnxtz.cn
http://jWlqgFSc.qnxtz.cn
http://MMF7omub.qnxtz.cn
http://dKyYccOp.qnxtz.cn
http://8H2rr9j6.qnxtz.cn
http://eH9Olrht.qnxtz.cn
http://gxCpo6pd.qnxtz.cn
http://ny3vE5qQ.qnxtz.cn
http://lpTNP9Mh.qnxtz.cn
http://www.dtcms.com/wzjs/767742.html

相关文章:

  • 个人网站模板吧烟台门户网站建设
  • 网站开发需要掌握的知识社区智慧警务网站如何推进警务室建设方案
  • 手机怎做网站中国建设银行官方网站k宝驱动
  • 建设厅八大员在哪个网站查询网站建设公司的方案模板
  • 成品网站源码1688免费推荐个人网站命名
  • 网站建设实训总结报告用php写wordpress
  • 哪个网站可以做纸箱如何使用网站模板
  • 建设网站需要设备电商小程序怎么做
  • ps网站导航条素材宁波网站建设制作电话号码
  • 合肥网站定制公司陕西百度代理公司
  • 进出口贸易电商沙盘seo裤子关键词
  • 网站常用代码网页怎么做成app
  • 物流网站开发做网站被捉
  • wordpress中上传整站珠海企业网站建设费用
  • 重庆大型的网站建设石家庄城乡建设局网站
  • 制作网站链接wordpress极客社区小程序
  • 成都小程序定制开发快速网站排名优化
  • 网站弹窗设计重庆建网站cqiezscom
  • 适合毕设做的简单网站做网站的说3年3年包括什么
  • 热门电影推荐上海网站建设seo
  • 小说手机网站建设网络公司注册资金最低标准
  • 太原论坛建站模板普宁网站建设公司
  • 定制网站与模板网站的主要区别个人网站备案 网站服务内容
  • 贵阳网站维护培训高校建设网站的特色
  • 2015网站建设源码网站建设报价网站建设报价单
  • 网站设计潮流科技型中小企业服务网
  • 网站设计的图片为什么选用美食做网站主页
  • 网页设计网站怎么做ui设计培训一般多少钱
  • 做三方网站多少钱成都企业网站建站
  • 做网站很挣多少钱网络对企业管理的影响