设计模式——代理模式

来源:互联网 发布:seo营销工具 编辑:程序博客网 时间:2024/05/29 15:20

代理模式

概述:

       代理模式为另一个对象(被代理对象)提供一个替身或占位符(代理对象)以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制某对象的访问,被代理的对象可以是远程对象,创建开销大的对象或者需要安全控制的对象。

作用:

1.       远程代理控制对远程对象的访问

2.       虚拟代理控制访问创建开销大的资源

3.       保护代理基于控制权限控制对资源的访问

主要角色:

1.       客户对象:客户对象以为自己在和真正实现功能的对象沟通(被代理对象),其实他只是在和代理对象沟通。

2.       代理对象:中间角色,将自己伪装成被代理对象

3.       被代理对象:真正实现功能的对象

类图:


代理模式与装饰模式的比较

1.      结构很相似,都是用一个对象把另一对象包起来,然后委托给具体处理类。

2.      目的不同,装饰者为对象增加行为,代理控制对象的访问

代理模式与适配器模式的比较

1.      都是挡在其他对象前,并负责将请求转发给他们

2.      适配器会改变对象适配的接口,代理实现相同的接口

 

Java中的动态代理

1.        Proxy由java产生,并实现了完整的subject接口。提供invocationHandler响应代理的任何调用。也就是proxy上的任何方法都会被传入此类,invocationHandler控制对RealSubject的访问。

        

 

2.      动态代理的实现

a)      主题接口 Subject

package com.proxy;

public interface Subject {

  void func();

}

 

b)     真实主题 RealSubject

package com.proxy;

public class RealSubject implements Subject{

    @Override

    public void func() {

        System.out.println("真实对象中的处理方法");

       

    }

}

 

c)      实现调用处理器并创建代理类 MyInvocationHandler

 package com.proxy;

importjava.lang.reflect.InvocationHandler;

importjava.lang.reflect.Method;

importjava.lang.reflect.Proxy;

 

public class MyHandler implementsInvocationHandler{

 

    Subject sub//被代理对象

    public MyHandler(){}

   

    publicMyHandler(Subject sub){

        this.sub=sub;

    }

    @Override

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

       // TODO Auto-generated method stub

       System.out.println("响应代理的调用,控制对真实对象的访问");

       System.out.println("访问真实对象前需要处理的事。。。。。。。");

       method.invoke(sub, args);//响应代理的调用

       System.out.println("访问真实对象后处理的事........");

       return null;

    }

   

    //该方法需要一个Subject对象作为参数,然后返回它的代理

    public  Subject getRealSubjectProxy(Subject sub){

           return (Subject) Proxy.newProxyInstance(sub.getClass().getClassLoader(),//被代理类的类加载器

                  sub.getClass().getInterfaces(),//代理需要实现的接口

                  new MyHandler(sub));//代理需要实现的接口

    }

   

}

 

3.      输出结果

 响应代理的调用,控制对真实对象的访问

访问真实对象前需要处理的事。。。。。。。

真实对象中的处理方法

访问真实对象后处理的事

 

原创粉丝点击