代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。
一、代理模式
生活中,我们去租房子的时候,会去找中介,因为他们比较专业,熟悉房源信息;打官司的时候,聘请律师,因为他们更有经验…,诸如此类的事件,都有代理模式的含义,其UML图如下:
代理模式一般会有三个角色:
抽象角色(Subject):指代理角色和真实角色对外提供的公共方法,一般为一个接口。
真实角色(RealSubject):需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以供代理角色调用,也就是真正的业务逻辑在此。
代理角色(Proxy):需要实现抽象角色接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法。
二、案例分析
我们都知道《西游记》中去往西天取经的是师徒四人,但其实唐僧是代替唐太宗去往西天取经的。不信,你看书中第十二回《玄奘秉诚建大会 观音显象化金蝉》中这样描绘:
太宗见了颂子,即命众僧:“且收胜会,待我差人取得大乘经来,再秉丹诚,重修善果。”众官无不遵依。当时在寺中问曰:“谁肯领朕旨意,上西天拜佛求经?”问不了,旁边闪过法师,帝前施礼道:“贫僧不才,愿效犬马之劳,与陛下求取真经,祈保我王江山永固。”唐王大喜,上前将御手扶起道:“法师果能尽此忠贤,不怕程途遥远,跋涉山川,朕情愿与你拜为兄弟。”
在世人看来,这经就是唐僧给取回来的,但只有皇帝知道,这经是唐僧替自己取回来的。这就是一个简单的代理模式,其UML图如下:
Subject–Person类,不管是皇帝还是唐僧,都要完成取经的任务。
interface Person {
public void takeBook();
}
RealSubject–实际完成的是唐太宗的旨意。
class Emperor implements Person {
public void takeBook() {
System.out.println("我是皇帝,我要上西天拜佛求经。");
}
}
Proxy–唐僧,代替皇帝完成取经任务。
class TangMonk implements Person {
Emperor emperor = new Emperor();
public void takeBook() {
emperor.takeBook();
}
}
故事上演:
public class Story(){
public static void main (String [] args){
TangMonk tangMonk = new TangMonk();
tangMonk.takeBook();
}
}
运行结果:
代码地址:Proxy
综上就是一个代理模式的例子,使用代理模式,可以将系统功能划分的更加清晰。
欢迎大家留言评论,点击查看更多设计模式。