代理模式
定义:为其他对象提供一种代理以控制对这个对象的访问。某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式角色介绍
- Subject:抽象角色,定义公共接口。
- RealSubject:真实角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
- Proxy:代理角色,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作
代理模式结构是一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理。对象实现同一个接口,先访问代理类再访问真正要访问的对象。代理模式在生活的例子也不少,例如跨境代购、游戏代练、演员经纪人等等,这些都有代理的影子。这里以游戏里的代练为例,自己升级觉得非常费力,所以请了代练达到同样的目的。
代码示例
抽象主题类(玩家)
public interface Player {
void play();
}
真实主题类(真实玩家)
public class RealPlayer implements Player{
public void play() {
System.out.println("打怪升级");
}
}
代理类(代理玩家)
public class ProxyPlayer implements Player{
private RealPlayer realPlayer = new RealPlayer();
public void play() {
System.out.println("帮真实玩家代练");
realPlayer.play();
}
}
客户端
Player proxyPlayer = new ProxyPlayer();
proxy.play();
代理模式中真实角色有可能没能力去与客户端直接操作,而通过代理去转达,比如让人去代购,因为我省了签证的麻烦。代理类就像客户端与真实角色建起的一座桥梁,将客户端要做的事让代理类去转达。就比如Java与C通信,就得有JNI负责转达。代理角色还可以在调用真实角色逻辑前做一些事情,就是常说的面向切片编程。代理模式运用非常广泛,很多著名大项目都有代理模式的存在。
代理模式分为静态代理、动态代理。静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。动态代理的作用在这知乎上有讨论,同学们可以移步了解。
https://www.zhihu.com/question/20794107