美文网首页
设计模式之代理

设计模式之代理

作者: TonyWuYU | 来源:发表于2017-09-01 12:59 被阅读0次

设计模式之代理模式


一、定义

在Java中代理的实现一般分为三种:JDK静态代理、JDK动态代理以及CGLIB动态代理。在Spring的AOP实现中,主要应用了JDK动态代理以及CGLIB动态代理

简介

直接来说,代理模式就是为被代理类提供一个外界的访问点。例如火车站售货员替(代理)我们完成在网上购买火车票的动作。

角色

  • 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。

  • 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

  • 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。


二、代码展示


import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

/**

* Created by yuwu on 2017/9/1.分为静态代理和动态代理,本文先分析静态代理,

后续介绍动态代理。

* 设计模式之代理模式

*/

public class ProxyTest {

public static void main(String[] args) {

//被代理类

Seller seller = new Seller();

//静态代理测试

ProxySell proxySell = new ProxySell(seller);

proxySell.bug();

/**

* 静态代理:

* 1、当【代理接口】扩展时,例如多了【checkout】方法,【商场售货员】需要改代码进行拓展的同时,

* 【ProxySell】也需要改代码进行拓展,导致拓展性差。

* 2、当【被代理类】增加时,例如多了【业务员】等,也需要对代理类【ProxySell】进行扩展,比较繁琐。

*/

//动态代理测试

ProxyDynamic proxyDynamic = new ProxyDynamic(seller);

SellAction sellAction = (SellAction) Proxy.newProxyInstance(proxyDynamic.getClass().getClassLoader(),

seller.getClass().getInterfaces(), proxyDynamic);

sellAction.bug();

/**

* 动态代理:

* 1、拓展灵活,不需要重点关注被代理类的方法, 以及代理类的

* 2、我们不知道要针对哪个接口、哪个被代理类创建代理类,因为它是在运行时被创建的(反射机制)。

*/

}

}

/**

* 代理接口,方法为【bug】

*/

interface SellAction {

void bug();

}

/**

* 商场售货员, 实现购买方法。

*/

class Seller implements SellAction {

@Override

public void bug() {

System.out.println("Bug ticket!");

}

}

/**

* 静态代理类,实现代理动作接口,代理售货员购买。

*/

class ProxySell implements SellAction {

SellAction sellAction;

public ProxySell(SellAction sellAction) {

this.sellAction = sellAction;

}

@Override

public void bug() {

System.out.println("ProxySell : Start");

sellAction.bug();

System.out.println("ProxySell : End");

}

}

/**

* 动态代理类【ProxyDynamic】

* 核心点: 实现【InvocationHandler】接口

*/

class ProxyDynamic implements InvocationHandler {

Object object;

public ProxyDynamic(Object object) {

this.object = object;

}

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

System.out.println("ProxyDynamic : Start");

Object ret = method.invoke(object, args);

System.out.println("ProxyDynamic : End");

return null;

}

}

例子输出:

ProxySell : Start

Bug ticket!

ProxySell : End

ProxyDynamic : Start

Bug ticket!

ProxyDynamic : End

相关文章

  • 设计模式之代理模式

    设计模式之代理模式 10分钟看懂动态代理设计模式(升级篇)-对这篇动态代理模式的思路整理 仿JDK实现动态代理逻辑...

  • 代理模式

    设计模式之代理模式 什么是代理模式? 指的事代理对象为其他对象提供代理以控制对被...

  • Java设计模式之代理模式

    Java设计模式之代理模式 代理模式 静态代理 动态代理 为什么需要代理 通过代理,我们能够不用知道委托人是谁,而...

  • Java代理模式之JDK动态代理

    了解什么是动态代理模式,可参考Java设计模式之代理模式 简介 JDK动态代理是java.lang.reflect...

  • 设计模式之代理模式2

    设计模式之代理模式运用 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对...

  • 设计模式之代理模式

    设计模式之代理模式 简介 代理模式是结构型设计模式。 当无法或不想直接访问某个对象或访问某个对象存在困难时可以通过...

  • 设计模式之代理模式

    设计模式之代理模式 今天学到Spring的动态代理实现AOP,对代理这个概念很模糊,看了一篇文章发现这使用了设计模...

  • 设计模式之代理模式

    title: 设计模式之代理模式date: 2018-08-15 20:25:42tags: 设计模式 笔记 Ja...

  • Java代理模式之CGLIB动态代理

    了解什么是动态代理模式,可参考Java设计模式之代理模式 简介 前面我们了解了JDK动态代理技术,发现其真实对象必...

  • java之代理技术

    java之代理模式 直接聊技术! 描述 代理模式是常用的java设计模式,代理类主要负责为委托类预处理消息、过滤消...

网友评论

      本文标题:设计模式之代理

      本文链接:https://www.haomeiwen.com/subject/tanhjxtx.html