结构型设计模式之代理模式(代码片段)

丨Jack_Chen丨 丨Jack_Chen丨     2022-12-01     584

关键词:

@TOC

代理模式

分类

1.静态代理:静态定义代理类

2.动态代理:动态生成代理类

主要角色

代理模式一般包含三种角色:

1.抽象主题角色(Subject)

2.真实主题角色(RealSubject)

3.代理主题角色(Proxy)

作用

1.保护目标对象,将代理对象与真实被调用目标对象分离

2.增强目标对象

3.降低系统耦合性,提升扩展性

静态代理与动态代理的区别

静态代理的基本使用

买票前的操作
进行买票操作
买票后的操作

JDK动态代理的基本使用

创建抽象主题

public interface IUser 
    /**
     * 购物
     */
    void shopping();

创建真实主题

public class User implements IUser
    @Override
    public void shopping() 
        System.out.println("user shopping....");
    

创建代理主题

public class JDKProxy implements InvocationHandler 

    private Object tarjet;

    public JDKProxy(Object tarjet) 
        this.tarjet = tarjet;
    

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
        System.out.println("代理user,执行shopping()开始...");
        Object oj = method.invoke(tarjet, args);
        System.out.println("代理user,执行shopping()结束...");
        return oj;
    

客户端调用

    public static void main(String[] args) 
        User user = new User();
        JDKProxy jdkProxy = new JDKProxy(user);
        IUser proxyInstance = (IUser) Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(), jdkProxy);
        proxyInstance.shopping();
    
代理user,执行shopping()开始...
user shopping....
代理user,执行shopping()结束...

小优化

在调用时候,传入了一推参数,可进一步优化

public class JDKProxy implements InvocationHandler 

    private Object tarjet;

    public Object JDKProxy(Object target)
        this.tarjet = target;
        Class<?> clazz =  target.getClass();
        return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
    

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
        System.out.println("代理user,执行shopping()开始...");
        Object oj = method.invoke(tarjet, args);
        System.out.println("代理user,执行shopping()结束...");
        return oj;
    
    public static void main(String[] args) 
        JDKProxy jdkProxy = new JDKProxy();
        IUser user= (IUser)jdkProxy.JDKProxy(new User());
        user.shopping();
    

CGLIB动态代理的基本使用

注意:CGLib不能代理final的方法

创建抽象主题

注意:CGLb代理的目标对象不需要实现任何接口,就可以通过动态继承目标对象实现动态代理。所以此处可以不用创建接口。直接使用真实主题。

public interface IUser 
    public void shopping();

创建真实主题

public class User implements IUser
    @Override
    public void shopping() 
        System.out.println("user shopping....");
    

直接使用真实主题。

public class User 
    public void shopping() 
        System.out.println("user shopping....");
    

创建代理主题

public class CglibProxy implements MethodInterceptor 
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable 
        System.out.println("代理user,执行shopping()开始...");
        Object invokeSuper = methodProxy.invokeSuper(o, objects);
        System.out.println("代理user,执行shopping()结束...");
        return invokeSuper;
    

客户端调用

    public static void main(String[] args) 
        CglibProxy cglibProxy = new CglibProxy();
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(User.class);
        enhancer.setCallback(cglibProxy);
        IUser iUser = (IUser) enhancer.create();
        iUser.shopping();
    

小优化

在客户端调用时,稍显复杂,可进一步优化

public class CglibProxy implements MethodInterceptor 

    public Object getInstance(Class<?> clazz) throws Exception
        //相当于Proxy,代理工具类
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();
    

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable 
        System.out.println("代理user,执行shopping()开始...");
        Object invokeSuper = methodProxy.invokeSuper(o, objects);
        System.out.println("代理user,执行shopping()结束...");
        return invokeSuper;
    
    public static void main(String[] args) throws Exception 
        IUser user = (IUser) new CglibProxy().getInstance(User.class);
        user.shopping();
    

CGLIB与JDK动态代理区别

1.执行条件

2.实现机制

3.性能

结构型模式:代理模式(代码片段)

...他对象提供一种代理以控制对这个对象的访问。(来自《设计模式之禅》)你要的故事咱们从事IT行业,随时都可能上网查东西,如果网络 查看详情

设计模式之-代理模式(proxypattern)(代码片段)

...ProxyPattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 C++代码实现:#include<iostream>usingnamespacestd;//抽象类,抽象的... 查看详情

设计模式之代理模式(结构型)(代码片段)

...st();postRequest();publicvoidpostRequest()……1.4模式类型来自:《设计模式》一书归纳分类远程(Remote)代理:为一个位于不同的地址空间的对象提供一个本地的代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机... 查看详情

设计模式之-代理模式(代码片段)

定义:代理模式(ProxyPattern):给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate,它是一种对象结构型模式。代理模式参与者Subject:定义了RealSubject和Proxy的共用接口,这样就在任... 查看详情

javascript设计模式--结构型--设计模式之proxy代理模式(12)(代码片段)

     JAVASCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVASCRIPT语言来实现主体功能,所以不可能像C++,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVASCRIPT代码,代码只是实现了设计模... 查看详情

java设计模式之代理模式(代码片段)

...种代理,以控制对这个对象的访问,属于结构型设计模式在某些情况下,一个对象不适合或者不能直接引用另外一个对象,而代理对象可以在客户端与目标对象之间起到中介作用应用场景:生活中的租房中介&#... 查看详情

设计模式之代理模式(代码片段)

什么是代理模式?代理模式的定义为:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 类图结构... 查看详情

设计模式之代理模式(代码片段)

代理模式1.简要概述2.模式分类3.模式结构4.实现代码5.优点好处6.缺点弊端7.应用场景8.应用示例1.简要概述代理模式就是通过代理对象来控制对真实对象的访问,也就是详细的控制访问某个对象的方法,从而将一些统一的... 查看详情

设计模式之代理模式(代码片段)

  今天我要介绍的设计模式叫做代理模式。对于这个设计模式相信大家应该是比较熟系的,spring中的AOP使用的就是动态代理模式。代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问(摘自百度百科)。... 查看详情

设计模式之结构型模式(代码片段)

在解决了对象的创建问题之后,对象的组成以及对象之间的依赖关系就成了开发人员关注的焦点,因为如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等。对象结构的设计很容易体现出... 查看详情

设计模式之代理模式(代码片段)

...xyPattern)中:①一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。②我们创建具有现有对象的对象,以便向外界提供功能接口。介绍作用:为其他对象提供一种代理以控制对这个对象的访问,举个例子来说明代... 查看详情

java之静态代理模式(代码片段)

静态代理模式:这种模式可以实现帮助被代理者完成一些前期的准备工作和后期的善后工作,但是核心的业务逻辑仍然是由被代理者完成。代码结构由三部分组成(1)接口:主题(2)代理类(3)被代理类实现方式:代理类和被... 查看详情

设计模式之代理模式(代码片段)

代理模式——ProxyPattern代理就是真实对象的代表代理模式的作用  1、远程代理:为一个对象在不同地址空间提供局部代表。  2、虚拟代理:若要创建一个开销很大的对象,使用代理控制创建进度。  3、安全代理:控制真... 查看详情

设计模式之动态代理(代码片段)

1背景回顾设计模式是一种思维方式,前人总结的最佳实践,也是一种态度,一种进步。软件过程里面设计模式一共有23种,一般分为3类。即创建型,结构性型,行为型。其中:****创建型5种:****解... 查看详情

设计模式结构型模式--代理模式(代理模式概述结构静态代理动态代理)(代码片段)

01:设计模式结构型模式–代理模式(代理模式概述、结构、静态代理、动态代理)02:设计模式结构型模式–代理模式(动态代理(JDK动态代理(JDK动态代理要求必须定义接口,对接口进行代理。&... 查看详情

设计模式之—代理模式(代码片段)

1.代理模式定义Provideasurrogateorplaceholderforanotherobjecttocontrolaccesstoit.对其他对象提供一种代理,以控制对这个对象的访问2.代理模式通用类图代理模式的通用类图如下:其中Subject为抽象主题角色:Subject为普通业务接口RealSubject为具... 查看详情

设计模式之代理模式(代码片段)

...通过一个代理对象来间接访问。1.1什么是代理代理是一种设计模式。当我们想要添加或修改现有类的某些功能时,我们创建并使用代理对象。使用代理对象而不是原始代理对象。通常,代理对象具有与原始代理对象相同的方法,... 查看详情

设计模式之静态代理模式(代码片段)

 //设计模式之静态代理模式interfaceChefervoidBecomeChefer();//小明想当厨师,天天做好吃的classXiaoMingimplementsChefer@OverridepublicvoidBecomeChefer()System.out.println("我要学厨艺");//我是中介,钱出够了什么都妥了classProxyimplements 查看详情