本文源码:GitHub·点这里 || GitEE·点这里

一、生活场景

1、场景描述

在电商高速发展的今天,快递的数量十分庞大,甚至出现了快递代理行业,简单的说就是快递的主人没有时间收快递,会指定一个快递的代收点,比如快递柜,快递驿站等,然后等有时间的时候再过去取,下面使用代码对这个场景进行简单的描述。

2、场景图解

3、源码实现

public class C01_InScene {
public static void main(String[] args) {
/*自己收快递的测试方式*/
GetExpress getExpress = new GetExpress();
getExpress.sureInfo();
getExpress.signName("张三");
/*代收快递的测试方式*/
ExpressAct getUser = new GetExpress();
ExpressAct getProxy = new ProxyExpress(getUser);
getProxy.sureInfo();
getProxy.signName("李四");
}
}
/**
* 接收一个快递的动作接口:确认信息,签名
*/
interface ExpressAct{
void sureInfo();
void signName(String name);
}
/**
* 定义一个类接收快递:自己去拿快递
*/
class GetExpress implements ExpressAct{
@Override
public void sureInfo() {
System.out.println("请确认你的个人信息!");
}
@Override
public void signName(String name) {
System.out.println("你的名字是:"+name);
}
}
/**
* 定义一个类接收快递:找人代领快递
*/
class ProxyExpress implements ExpressAct{
private ExpressAct expressAct=null;
public ProxyExpress(ExpressAct expressAct){
this.expressAct = expressAct;
}
@Override
public void sureInfo() {
this.expressAct.sureInfo();
}
@Override
public void signName(String name) {
this.expressAct.signName(name);
}
}

二、代理模式

1、概念描述

代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。所谓代理,就是一个对象代表另一个对象执行相应的动作程序。而代理对象可以在客户端和目标对象之间起到中介的作用。

2、模式图解

3、核心角色

  • 抽象对象角色

声明目标对象和代理对象的共同接口。

  • 目标对象角色

定义了代理对象所代表的目标对象。

  • 代理对象角色

代理对象内部含有目标对象的引用,可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象,AOP编程就是基于这个思想。

4、源码实现

public class C02_Proxy {
public static void main(String[] args) {
AbstractObject object = new ProxyObject();
object.operation();
}
}
/**
* 抽象对象角色
*/
abstract class AbstractObject{
public abstract void operation();
}
/**
* 目标对象角色
*/
class TargetObject extends AbstractObject{
@Override
public void operation() {
System.out.println("Target Method Run...");
}
}
/**
* 代理对象角色
*/
class ProxyObject extends AbstractObject{
TargetObject targetObject = new TargetObject();
@Override
public void operation() {
System.out.println("Method Before...");
targetObject.operation();
System.out.println("Method After...");
}
}

三、JDK动态代理

基于JDK动态代理方式实现AOP切面编程。

1、代码实现

public class C03_JdkProxy {
public static void main(String[] args) {
BookService bookService = BookAopProxyFactory.createService() ;
System.out.println(bookService.getBook());
}
}
class BookAspect {
public void before (){
System.out.println("Method Before ...");
}
public void after (){
System.out.println("Method After ...");
}
}
interface BookService {
String getBook () ;
}
class BookServiceImpl implements BookService {
@Override
public String getBook() {
System.out.println("目标方法【getBook】被执行");
return "高性能MySQL";
}
}
class BookAopProxyFactory {
public static BookService createService() {
// 目标类
final BookService bookService = new BookServiceImpl() ;
// 切面类
final BookAspect bookAspect = new BookAspect();
/*
* 代理类:将目标类(切入点)和 切面类(通知) 结合
*/
BookService proxyBookService = (BookService) Proxy.newProxyInstance(
BookAopProxyFactory.class.getClassLoader(),
bookService.getClass().getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
// 前执行
bookAspect.before();
// 执行目标类的方法
Object obj = method.invoke(bookService, args);
// 后执行
bookAspect.after();
return obj;
}
});
return proxyBookService ;
}
}

四、几种常见代理

  • 防火墙代理

内网通过代理穿透防火墙,实现对公网的访问。

  • 缓存代理

为了缓解网站并发压力,在请求数据库资源时,先取缓存中代理的数据,如果缓存未命中,再到数据库取数据,然后缓存取到的数据。

  • 远程代理

远程对象的本地代理对象,通过它可以把远程对象当本地对象调用 。远程代理通过网络和调用的远程对象进行信息交互 。

  • 同步代理

主要使用在多线程编程中,完成多线程间同步工作。

五、源代码地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述设计模式(16):代理模式的更多相关文章

  1. Java基础-设计模式之-代理模式Proxy

    代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理 ...

  2. 基于JAVA的设计模式之代理模式

    概念 王宝强有一个经纪人叫宋喆,这个经纪人很吊,可以代理王宝强做一系列的事情,与粉丝活动.王宝强的微博维护.安排王宝强的行程以及什么什么等等.如果王宝强一个人做岂不是累死.通过这个代理人为王宝强节省了 ...

  3. Java常见设计模式之代理模式

    指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其它相关业务的处理.比如生活中的通过代理访问网络,客户通过网络代理连接网络(具体业务),由代理服务器完成用户权限和访问限制等与 ...

  4. Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景

    我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...

  5. 夜话JAVA设计模式之代理模式(Proxy)

    代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...

  6. Java设计模式:代理模式(转)

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一 ...

  7. java设计模式6——代理模式

    java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代 ...

  8. 理解java的三种代理模式

    代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展. 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing(). 1 public class ...

  9. C#设计模式(13)——代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

随机推荐

  1. java.lang.IllegalArgumentException: System memory 259522560 must be at least 471859200.

    报错信息 java.lang.IllegalArgumentException: System memory 259522560 must be at least 471859200. Please ...

  2. 一篇文章了解Redis数据库

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. redis是一个key-value存储系统.它支持存储的value类型相对更多,包括string(字符串).l ...

  3. (5)Makefile详解

         Makefile是一个自动化的编译工具,关系到整个工程的编译规则,极大的提高了软件开发的效率.     (1)Makefile的编译规则 //Makefile 也可以写作 makefile1 ...

  4. commons-beanutils.jar及其支持文件

    下载地址: 链接:https://pan.baidu.com/s/1AtiK3nsk0aBuBfMdNwBVGw 密码:6tul

  5. 用.NET做动态域名解析

    用.NET做动态域名解析 动态域名解析,或DNSR,通常用于解析IP地址经常变化的域名.电信网络提供了公网IP,给广大程序员远程办公.内容分享等方面带来了极大的便利.但公网IP是动态的,它会经常变化, ...

  6. 数位DP 详解

    序 天堂在左,战士向右 引言 数位DP在竞赛中的出现几率极低,但是如果不会数位DP,一旦考到就只能暴力骗分. 以下是数位DP详解,涉及到的例题有: [HDU2089]不要62 [HDU3652]B-n ...

  7. spark运行信息及报错问题解决集锦

    错误1: ERROR client.RemoteDriver: Failed to start SparkContext: java.lang.IllegalArgumentException: Ex ...

  8. spring cache常用注解使用

    1.@CacheConfig 主要用于配置该类中会用到的一些共用的缓存配置.示例: @CacheConfig(cacheNames = "users") public interf ...

  9. 容器技术----------->Docker

    1. 虚拟化 1)什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种 实体资源,如服务器.网络.内存及存储等,予以抽象.转换后呈现出来,打破实体 ...

  10. java跬步积累

    1.eclipse自动生成get/set方法快捷键 alt+shift+s +r 2.eclipse自动生成等号左边快捷键 将光标移到:号右边,然后按Ctrl+1 3.补全代码快捷键 Alt+/ 4. ...