设计模式(三)代理设计模式

news/2025/2/12 18:35:22/

文章目录

    • 1.定义
    • 2.使用场景:
    • 3.代理模式分类
        • 3.1 静态代理模式
        • 4.1 动态代理模式

更多设计模式文章请阅读:

设计模式专栏

1.定义

为其他对象提供一种代理以控制对这个对象的直接控制

UML建模图.png

2.使用场景:

当无法或者直接访问到目标对象的时候,或者访问某个对象有困难的时候,可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象要实现相同的接口,即(代理和委托的约束)

3.代理模式分类

   分为两种:静态代理、动态代理。静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。动态代理是在程序运行时通过反射机制动态创建的

3.1 静态代理模式

  • 简单实现
/*** 接口约束*/
public abstract class Subject {//普通的业务方法abstract void visit();
}
  • 委托类
/*** 业务真实处理类*/
public class RealSubject extends Subject {@Overridevoid visit() {System.out.println("真正的实现方法");}
}
  • 代理类
/*** 代理类*/
public class ProxySubject extends Subject {private  Subject mSubject;public ProxySubject(Subject subject) {this.mSubject=subject;}@Overridevoid visit() {mSubject.visit();}
}
  • 项目中使用示例
    以Android工程示例,在项目开发中,前期使用的网络访问请求框架为volley,但是在项目迭代几个版本以后,发现使用volley框架,对大文件的下载支持不是很好(因为volley在下载文件的时候,目标文件有多大,直接创建一个和目标文件一样大小的文件,占用资源较大)这个时候,要求更换网络请求框架,如果这个时候,代码耦合度高的话,则使用到网络请求的地方,都会进行相应的修改,当然一个好的架构,会让切换框架变的非常简单。如下
public interface Ihttp {/*** GET 请求* @param url*/void get(String url);/*** POST 请求* @param url* @param params*/void post(String url,String params);//....}

代理请求网络类

public class HttpProxy implements Ihttp {private void HttpProxy() {}public static HttpProxy mInstance;public static HttpProxy getInstance() {if (mInstance == null) {synchronized (HttpProxy.class) {if (mInstance == null)mInstance = new HttpProxy();}}return mInstance;}private Ihttp mModle;public void setHttpModle(Ihttp modle) {this.mModle = modle;}@Overridepublic void get(String url) {mModle.get(url);}@Overridepublic void post(String url, String params) {mModle.post(url, params);}
}

okhttp访问网络框架

public class OkhttpModle implements Ihttp {@Overridepublic void get(String url) {//模拟okhttp请求网络System.out.println("Okhttp request get()" + url);}@Overridepublic void post(String url, String params) {System.out.println("Okhttp request post(params)" + url);}
}

volley访问网络框架

public class VolleyModle implements Ihttp {@Overridepublic void get(String url) {//模拟Volley请求网络System.out.println("Volley request get()" +url);}@Overridepublic void post(String url, String params) {System.out.println("Volley request post(params)" +url);}
}

项目初始化配置使用

public class Client {public static void main(String[] args){//如果使用volley请求框架
//        HttpProxy.getInstance().setHttpModle(new VolleyModle());//如果使用okhttp请求框架HttpProxy.getInstance().setHttpModle(new OkhttpModle());HttpProxy.getInstance().get("http://www.baidu.com");}
}

打印结果:

Okhttp request get()http://www.baidu.com

4.1 动态代理模式

定义:通过反射机制动态生成代理者对象,也就是说在code阶段不知道要代理谁,在执行阶段决定,java也提供了一个便捷的动态代理接口

/*** 接口约束*/
public interface Subject {//普通的业务方法void visit();}
/*** 业务真实处理类*/
public class RealSubject implements Subject {@Overridepublic void visit() {System.out.println("真正的实现方法");}
}
public class DynamicProxy implements InvocationHandler {private Object obj;public DynamicProxy(Object obj) {this.obj = obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object invoke = method.invoke(obj, args);return invoke;}
}
public class Client {public static void main(String[] args){Subject subject=new RealSubject();DynamicProxy proxy = new DynamicProxy(subject);ClassLoader classLoader = subject.getClass().getClassLoader();Subject real = (Subject) Proxy.newProxyInstance(classLoader, new Class[]{Subject.class}, proxy);real.visit();}
}

http://www.ppmy.cn/news/392391.html

相关文章

【瞎鼓捣】web前端全景直播

最近做了一个全景直播的小项目,走了一下大概的流程,特此记录一下。 1.直播服务器 首先利用srs搭建直播服务器,这部分我是跟着官方wiki走的,详细内容请移步 v4_CN_Home ossrs/srs Wiki (github.com)https://github.com/ossrs/sr…

Intent.createChooser方法在HTC OneX上意外会引发onConfigurationChanged方法

android就是这点不好,机型太多,什么奇怪的Bug都有。今天又遇上一个,是说在A界面编辑本地联系人返回后会返回到B界面(B界面为默认界面)。A和B界面都受一个父Acitivy管理,类似像Tab页一样嵌入其中。 最后找到…

Matlab 调用.onnx模型

YOLO v5 onnx 下载 如果谁知道.onnx如何在matlab重新训练,请告知!! 1 调用的方法 参考cuixingxing的代码。 model "./onnxPretrainedModels/""yolov5x.onnx"; customYoloV5FcnName yolov5fcn; inputSize [640,640]; …

双线性插值算法ARM NEON优化

C语言版本双线性插值算法 inline double bilinear_interp(double x, double y, double v11, double v12,double v21, double v22) {return (v11 * (1 - y) v12 * y) * (1 - x) (v21 * (1 - y) v22 * y) * x; } 使用ARM NOEN优化后的双线性插值版本 inline uint8x8_t bili…

Skia深入分析

原文出处:http://blog.csdn.net/hgl868/article/details/45583667 一、渲染层级从渲染流程上分,Skia可分为如下三个层级:1、指令层:SkPicture、SkDeferredCanvas->SkCanvas这一层决定需要执行哪些绘图操作,绘图操作…

SpringBoot快速入门one

Spring Boot SpringBoot1.建立第一个SpringBoot项目模型快速构建maven构建 2.配置文件3.配置文件读取和绑定1.value2.Environment3.ConfigurationPropertiesComponent 4.profile(多环境切换)1.配置文件切换2. 虚拟机参数切换 5. 内部配置文件的加载顺序6. 外部配置加载顺序7. 使…

Angular ng serve 报错:Workspace needs to be loaded before it is used.

错误信息: D:\workspace-sts\dqgy\manage>ng serveC:\Users\dqgzs\AppData\Roaming\npm\node_modules\angular\cli\node_modules\angular-devkit\core\src\workspace\workspace.js:59 throw new WorkspaceNotYetLoadedException(); ^ Error: Workspace needs to…

One.x升级

One.x升级 下载最新语言版本上传最新文件修改JSON文件 下载最新语言版本 以阿拉伯语OneX_ARW为例,复制链接OneXDataPack到FTP中打开,找到最新版本8.23.0.1,复制到本地 上传最新文件 1.登录ArtiractoryJFrog Artiractory 2.在ark-core-gen…