代理模式(Proxy Pattern)

Posted anpeiyong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式(Proxy Pattern)相关的知识,希望对你有一定的参考价值。

 

 

一、定义

        某些情况下,一个对象  不适合 (或 不能) 直接引用  另一个对象,代理对象  可以起到  中介  作用;

二、组成

        a,抽象角色

            通过  接口(或  抽象类)  声明  真实角色  的业务; 

        b,真实角色

            实现  抽象角色

            定义  真实角色  的业务逻辑

            供  代理角色  调用

        c,代理角色

            实现  抽象角色,是  真实角色的代理;

三、模式分类

        a,静态代理

            1、定义:

                由程序员创建(或 工具生成)  代理类的源码,再编译代理类;

                所谓静态,指的是  程序运行前  已经存在代理类; 

            2、案例:

package com.an.designpattern;

/**
 * 通过接口、抽象类  ,声明真实角色的业务
 */
public interface User 
    void say();

  

package com.an.designpattern;

/**
 * 真实角色
 */
public class UserImpl implements User 

    public void say() 
        System.out.println("我是真实角色。。。");
    

  

package com.an.designpattern;

/**
 * 代理角色
 *      通过  构造器  将  真实角色    塞入 代理对象中;
 *      代理对象    还可以对 功能作扩展;
 */
public class UserProxy implements User

    private User user;

    public UserProxy()

    

    public UserProxy(UserImpl userImpl)
        this.user=userImpl;
    

    public void say() 
        System.out.println("我是代理角色。。。");
        user.say();
    

  

package com.an.designpattern;

/**
 * 静态代理测试
 */
public class StaticProxyTest 
    public static void main(String[] args)
        UserProxy userProxy=new UserProxy(new UserImpl());
        userProxy.say();
    




结果:
我是代理角色。。。
我是真实角色。。。

  

        b,动态代理

            1、定义:

                代码实现阶段  不用关心代理类,程序运行时才指定哪个对象;          

            2、实现方式:

                1.1  基于JDK的动态代理  实现  接口

                      A,在java.lang.reflect包下,提供了Proxy类InvocationHandler接口,通过这2个可以生成JDK动态代理类、动态代理对象;

                      B,Proxy类

                          1.1.1  Proxy类提供创建动态代理类、动态代理对象的静态方法;

                          1.1.2  如果需要为一个或多个接口 动态地生成实现类(或 实例),可以使用Proxy类;

                                  public static Class<?> getProxyClass(ClassLoader loader,Class<?>... interfaces)

                                     创建一个动态代理类所对应的Class对象,实现多个interfaces

                                              ClassLoader 指定生成动态代理类的类加载器;

                                        public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

 

                                     直接创建一个动态代理对象,该对象实现多个interfaces;

                                     执行代理对象的每个方法时,都会被换成InvocationHandler对象的invoke方法;

以上是关于代理模式(Proxy Pattern)的主要内容,如果未能解决你的问题,请参考以下文章

代理模式(Proxy Pattern)

代理模式(Proxy Pattern)

设计模式(十三)代理模式(Proxy Pattern)

设计模式之 - 代理模式(Proxy Pattern)

代理模式(Proxy Pattern)

代理模式--Proxy Pattern