代理模式【java版】

我们两清 提交于 2019-11-27 10:36:04

应用场景:
       安全代理:控制对原对象的访问权限
                注: 之所以把权限控制放在"代理类"中,而不是放在原对象中,主要依据"单一性原则".
       远程代理:网络通讯时,将加密,解密,打包,解包这些操作一起封装在"代理对象"使得客户端
                  调用时,就像是在访问本地数据.
                  eg: WebService的工作原理
       虚拟代理:当存在实例化需要很长时间的成员对象时,当需要调用到与该对象相关的方法时才
                  声明该对象,并实例化.
       智能指引:未使用过

基本特点: 代理拥有实际执行者的实例,代理的每一个函数,直接调用实际执行者对应的函数.

一、普通代理:

       (安全代理)

       1.原始接口

//原始类方法接口public interface Subject {   public void readFile(String fileName);   public void writeFile(String fileName);}

       2.原始类

//原始类:实现原始接口中的方法public class RealSubject implements Subject {    public void readFile(String fileName) {        System.out.println("进行读取文件操作!");    }    public void writeFile(String fileName) {        System.out.println("进行文件写入操作!");    }}

       3.代理类

public class Proxy implements Subject {    private Subject subject;    private boolean isReadable;    private boolean isWriteable;    //创建“代理对象”时,传入权限参数    public Proxy(Subject subject,boolean isReadable,boolean isWriteable) {        this.subject=subject;        this.isReadable=isReadable;        this.isWriteable=isWriteable;    }    public void readFile(String fileName) {        if(isReadable){            subject.readFile(fileName);        }else{            System.out.println("对不起,您没有文件读取权限!");        }    }    public void writeFile(String fileName) {        if(isWriteable){            subject.writeFile(fileName);        }else{            System.out.println("对不起,您没有写文件权限!");        }    }}

       4.测试

       测试代码:

public class Main {    public static void main(String[] args) {        System.out.println("开始测试代理模式。。。");        System.out.println();                Proxy theProxy=new Proxy(new RealSubject(),true,false);                theProxy.readFile(new String("mytext"));        theProxy.writeFile(new String("mytext"));    }}

       运行结果:


二、动态代理

 

 

三、代理模式与适配器模式,装饰模式的比较

    代理模式:   接口不变
    适配器模式: 接口改变
    
    代理模式: 控制对象的访问
    装饰者模式:动态多次添加装饰

    相同点:都封装对象
    不同点:
           代理模式:不改变外部调用的接口,只是原来对象的一个替身,控制对象,外界必须通过

                       代理才能使用被封装的对象.
           装饰模式:不改变外部调用的接口,通过新增私有方法对原接口功能进行增强
           适配器模式:改变外部调用的接口

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!