码迷,mamicode.com
首页 > 其他好文 > 详细

代理模式(Proxy Pattern)

时间:2019-09-12 00:17:03      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:模式分类   分类   直接   静态   作用   oca   loader   under   get   

 

 

一、定义

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

二、组成

        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)

标签:模式分类   分类   直接   静态   作用   oca   loader   under   get   

原文地址:https://www.cnblogs.com/anpeiyong/p/11509259.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!