代理模式【java版】
应用场景:
安全代理:控制对原对象的访问权限
注: 之所以把权限控制放在"代理类"中,而不是放在原对象中,主要依据"单一性原则".
远程代理:网络通讯时,将加密,解密,打包,解包这些操作一起封装在"代理对象"使得客户端
调用时,就像是在访问本地数据.
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")); } }
运行结果:
二、动态代理
三、代理模式与适配器模式,装饰模式的比较
代理模式: 接口不变
适配器模式: 接口改变
代理模式: 控制对象的访问
装饰者模式:动态多次添加装饰
相同点:都封装对象
不同点:
代理模式:不改变外部调用的接口,只是原来对象的一个替身,控制对象,外界必须通过
代理才能使用被封装的对象.
装饰模式:不改变外部调用的接口,通过新增私有方法对原接口功能进行增强
适配器模式:改变外部调用的接口
- 本文固定链接: http://www.ypbj.cc/post/60.html
- 转载请注明: yupang 于 余胖笔记 发表
《本文》有 0 条评论