文章目录

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

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

设计模式专栏

1.定义

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

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();}
}

设计模式(三)代理设计模式相关推荐

  1. 外观模式和代理模式的联系和区别_设计模式之代理设计模式

    原文首发于微信公众号:jzman-blog,欢迎关注交流! 今天来看一下什么是代理设计模式,顾名思义,代理就是通过中介代替某人做某一件事,对应到我们的程序中就是通过代理对象来控制某个具体对象某个方法的 ...

  2. Java设计模式(三) -- 代理模式

    代理是一种设计模式,即通过代理对象访问目标对象,这样可以在目标对象实现的基础上,增强额外的功能,即扩展目标类的功能. 通常编程中存在一种思想,即不要随意修改别人的代码或者方法,所以代理就可以在不修改目 ...

  3. 装饰设计模式,代理设计模式 最通俗易懂的案例

    import java.lang.reflect.Method;import org.springframework.cglib.proxy.Enhancer; import org.springfr ...

  4. GoF设计模式之代理设计模式

    该文章首发于GoF设计模式-代理模式 概述 代理模式(Proxy Pattern),为其他对象提供一种代理以控制对这个对象的访问. 代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可 ...

  5. 静态代理和动态代理设计模式

    为什么需要静态代理和动态代理? 不知道,说不清楚,说不好.... 静态代理设计模式: ①找到需要增强处理的类实现的接口 //玩家类实现的接口 public interface Player{boole ...

  6. java之 代理设计模式

    1. 设计一个案例来实现租房功能.分析:在租房的过程中涉及到了3个对象,房东,中介,房客. 中介和房客具有相同的功能--租房. 可以设计如下: 2.上图的设计实际上就是一个代理设计模式---静态代理设 ...

  7. 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)

    AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...

  8. Java抽象类(abstract)的定义和设计模式(模板设计模式)

    1.抽象类 package com.itstudy.bean;//抽象类/*** 抽象类:描述的内容不是具体的内容* 1.有abstract修改,并且有抽象方法* 2.一共类中有抽象方法,那么这个类一 ...

  9. JavaScipt设计模式初探-代理模式(三) 虚拟代理

    文章目录 前言 一.举例_图片懒加载 二.虚拟代理在示例中的体现 总结 前言 虚拟代理是代理模式在性能方面的分支, 个人认为有点像人工异步操作. 把累活和细活从真实对象拆出来丢给代理对象, " ...

  10. 【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )

    文章目录 前言 一.模拟 JVM 生成对应的 代理对象 二.模拟 JVM 生成对应的 代理对象 完整流程展示 1.目标对象接口 2.被代理对象 3.调用处理程序 4.模拟 JVM 生成的代理对象类 5 ...

最新文章

  1. ASP.NET页面动态添加js脚本
  2. Equinox P2的学习
  3. php的pathinfo,php中PathInfo的用法举例(图文)
  4. Combobox报错:row[opts.textField].toLowerCase is not a function。
  5. mysql5.6触发器,MYSQL5.6创建存储过程和触发器
  6. ApacheCN 深度学习译文集 20210112 更新
  7. 亚马逊Alexa已接入2万种设备,22岁开发者月入1万美元
  8. 【C++入门】从C到C++
  9. 公布中秋福利中奖名单
  10. 【Photoshop文字排版小技巧】
  11. 20春季 7-2 The Judger (25 分)
  12. SD卡SPI模式入门教程
  13. iOS小技能:监听H5页面goBack返回事件 网页监听APP返回键 (NavigationBackItemInjection)
  14. Java流程控制方法
  15. MinGW+MSYS安装
  16. maven(五)的自动化构建
  17. 北大igem生物计算机,喜讯|北京大学iGEM团队在国际大赛中取得金牌
  18. iPhone越狱真机调试
  19. hooks 使用dva_Tarodemo
  20. SourceTree修改Git账号密码

热门文章

  1. 华为项目管理10大模板Excel版(可直接套用_非常实用)
  2. 高德地图-初始化的时候获取行政区边界和中心点
  3. ZOJ3587 Marlon's String KMP技巧处理
  4. 服务器渠道销售的计划,云服务器的销售渠道
  5. 发现一个不错的导航网站:site114网站导航
  6. 怎么看计算机硬件配置情况,怎么样查看电脑配置?5种方法查看电脑硬件配置好坏图文详解...
  7. 交换机原理_交换机工作原理解析
  8. vue搜索关键字标红
  9. 0035:虫子吃苹果(C++)
  10. 请告诉我IT行业缺少怎样的人