概述
代理模式是Java开发中使用较多的一种设计模式。
代理设计就是为其他对象提供一种代理以控制对这个对象的访问。
代理模式的使用场景:
1)安全代理:屏蔽对真实角色的直接访问(不让被代理类对象暴露出去)。
2) 远程代理:通过代理类处理远程方法调用(RMI)
3) 延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象 。比如你要开发一个大文档查看软件,大文档中有大的图片,有可能一个图片有 100MB,在打开文件时,不可能将所有的图片都显示出来,这样就可以使用代理模式,当需要查看图片时,用proxy来进行大图片的打开。
代理模式的分类
1) 静态代理(静态定义代理类)
2) 动态代理(动态生成代理类)
注意: JDK自带的动态代理,需要反射等知识
区别:
动态代理: 写代码的时候不显式的把代理类写出来,在代码执行过程中动态 的生成一个代理类对象
静态代理: 针对不同的接口定义相应的代理类,代理类是专门针对这一个接口的代理类
理解:
比如:有一个接口叫做Object(不是我们通常所说的类Object),这个接口被ObjectImpl(称为被代理类)和ProxyObject(称为代理类)这两个类给实现了。
形象的说:Object代表租房子这件事,定义成了接口。实际上是我们自己想去找房子,我们自己就相当于是被代理类,但由于多种原因我们没时间自己去找,所以我们找了中介,中介就相当于是代理类。即通过代理类帮我们去做事,要求是代理类和被代理类都要实现接口,只是接口中的抽象方法实现的时候有所区别,本来是被代理类要做的事,通过代理类帮他完成,代理类会调用被代理类的有关方法,静态代理的话如果还有一个叫做买菜的接口,那就是另外一套代理类了。
以下代码都是静态代理
例子1:
package test;
public class Test2 {
public static void main(String[] args) {
Server server=new Server();
ProxyServer proxyserver=new ProxyServer(server);
proxyserver.browse();//形式上是调了代理类对象的方法,实际上在其方法体中调了被代理类的方法
//在代码层面server并没有显示的去调用browse
}
}
interface NetWork{
public void browse();//browse指的是浏览
}
//被代理类
class Server implements NetWork{
@Override
public void browse() {
System.out.println("真实的服务器来访问网络");
}
}
//代理类,proxy是代理的意思
class ProxyServer implements NetWork{
private NetWork work;//私有化接口引用变量
//提供当前代理类的构造器
public ProxyServer(NetWork work) {
this.work=work;
}
public void check() {
System.out.println("联网之前的检查工作");
}
@Override
public void browse() {
check();
work.browse();
}
}
例子2:
package test01;
public class test {
public static void main(String[] args) {
Star s = new Proxy(new RealStar());//也可以写成Proxy s = new Proxy(new RealStar())
s.confer();
s.signContract();
s.bookTicket();
s.sing();//实际上在方法体中调了明星的sing方法
s.collectMoney();
}
}
interface Star {
void confer();// 面谈
void signContract();// 签合同
void bookTicket();// 订票
void sing();// 唱歌
void collectMoney();// 收钱
}
//被代理类,明星
class RealStar implements Star {
public void confer() {
}
public void signContract() {
}
public void bookTicket() {
}
public void sing() {
System.out.println("唱歌");
}
public void collectMoney() {
}
}
//代理类,经纪人
class Proxy implements Star {
private Star real;//套路
public Proxy(Star real) {
this.real = real;//套路
}
public void confer() {
System.out.println("经纪人面谈");
}
public void signContract() {
System.out.println("经纪人签合同");
}
public void bookTicket() {
System.out.println("经纪人订票");
}
public void sing() {
real.sing();
}
public void collectMoney() {
System.out.println("经纪人收钱");
}
}