设计模式
一、代理模式概述
代理模式是Java开发中使用较多的一种设计模式。代理设计就是为其他对象提供一种代理以控制对这个对象的访问。
二、代码实例
接口的应用:代理模式
【类似:想要租房子 & 中介;明星 & 经纪人】
1. 为什么非要代理类来做?
因为代理类中不光做这个事,还做了些别的事,而被代理类只关注自己核心到底是要干什么就可以了
【如下代码就能看到,真正的明星类只关注自己的核心功能"唱歌"就可以了,其他的都由代理类来完成】
2. 静态代理
- 这里写的是静态代理(代理类是专门针对某一个接口的);
- 后期讲到框架会用到代理模式,但是是动态代理(代理类这次是代理租房子,下次是代理买菜…,究竟代理谁,是运行过程中动态分配的),需要用到反射的知识;
//测试
public class StaticProxyTest {
public static void main(String[] args) {
RealStar real = new RealStar();
Proxy p = new Proxy(real);
p.confer();
p.signContract();
p.bookTicket();
p.sing();
p.collectMoney();
}
}
/**
* 接口
*/
interface Star{
void confer(); //面谈
void signContract(); //签合同
void bookTicket(); //订票
void sing(); //唱歌
void collectMoney(); //收钱
}
/**
* 真正的明星类【实际上只关注自己的核心功能:"唱歌";其他功能不关注】
*/
class RealStar implements Star{
@Override
public void confer() {}
@Override
public void signContract() {}
@Override
public void bookTicket() {}
@Override
public void sing() {
System.out.println("明星,唱歌~~~");
}
@Override
public void collectMoney() {}
}
/**
* 代理类
* 【除了明星的核心功能"唱歌",其他都由代理类来完成即可;】
* 【需要"唱歌"的时候,调用真正的明星类来完成】
*/
class Proxy implements Star{
private RealStar real;
//创建代理类的时候,指明被代理的对象
public Proxy(RealStar real){
this.real = real;
}
@Override
public void confer() {
System.out.println("经纪人面谈");
}
@Override
public void signContract() {
System.out.println("经纪人签合同");
}
@Override
public void bookTicket() {
System.out.println("经纪人订票");
}
@Override
public void sing() {
real.sing(); //唱歌则调用被代理类来完成
}
@Override
public void collectMoney() {
System.out.println("经纪人收钱");
}
}
三、代理模式的应用场景
- 安全代理:屏蔽对真实角色的直接访问;
- 远程代理:通过代理类处理远程方法调用(RMI);
- 延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象;
【比如你要开发一个大文档查看软件,大文档中有大的图片,有可能一个图片有100MB,在打开文件时,不可能将所有的图片都显示出来,这样就可以使用代理模式,当需要查看图片时,用proxy来进行大图片的打开。】