设计模式之代理模式

来源:互联网 发布:php curl发送get请求 编辑:程序博客网 时间:2024/06/15 11:23

代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。

二、代理模式

代理模式的UML图如下:

这里写图片描述

代理模式一般会有三个角色:

抽象角色(Subject):指代理角色和真实角色对外提供的公共方法,一般为一个接口。

真实角色(RealSubject):需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以供代理角色调用,也就是真正的业务逻辑在此

代理角色(Proxy):需要实现抽象角色接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法。

二、案例分析

我们都知道《西游记》中去往西天取经的是师徒四人,但其实唐僧是代替唐太宗去往西天取经的。不信,你看书中第十二回《玄奘秉诚建大会 观音显象化金蝉》中这样描绘:

太宗见了颂子,即命众僧:“且收胜会,待我差人取得大乘经来,再秉丹诚,重修善果。”众官无不遵依。当时在寺中问曰:“谁肯领朕旨意,上西天拜佛求经?”问不了,旁边闪过法师,帝前施礼道:“贫僧不才,愿效犬马之劳,与陛下求取真经,祈保我王江山永固。”唐王大喜,上前将御手扶起道:“法师果能尽此忠贤,不怕程途遥远,跋涉山川,朕情愿与你拜为兄弟。”

在世人看来,这经就是唐僧给取回来的,但只有皇帝知道,这经是唐僧替自己取回来的。这就是一个简单的代理模式,其UML图如下:

这里写图片描述

Subject–Person类,不管是皇帝还是唐僧,都要完成取经的任务。

abstract class Person(){   public void takeBook();}

RealSubject–实际完成的是唐太宗的旨意。

class Emperor extends Person(){     public void takeBook(){       System.out.println("我是皇帝,我要上西天拜佛求经。");     }}

Proxy–唐僧,代替皇帝完成取经任务。

class TangMonk extends 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();  }}

运行结果:

我是皇帝,我要上西天拜佛求经。

综上就是一个代理模式的例子,点击更多设计模式。

原创粉丝点击