1、定义
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。
2、现实的应用场合
在现实世界中,我们最常见到的就是代理律师。一般法官问的问题都是原告被告直接回答的。那为什么还要代理律师呢,因为中间还有很麻烦的环节,请了代理律师以后,只要完成自己可以必须完成的工作外,其他都可以交给代理律师来完成。
3、代码实现
1)Subject类定义了RealSubject和Proxy的公用接口
public abstract class Subject
{
public abstract void Request();
}
2)RealSubject类,定义Proxy所代表的真实的实体
public class RealSubject extends Subject
{
@Override
public void Request()
{
System.out.println("这是真实的请求");
}
}
3)Proxy类,保存一个引用使得代理可以访问实体,并提供一个与Subject接口相同的接口,这样代理就可以用来替代实体。
public class Proxy extends Subject
{
RealSubject realSubject=null;
@Override
public void Request()
{
if(realSubject==null)
{
realSubject=new RealSubject();
}
realSubject.Request();
}
}
4)测试类ClientTest
public class ClientTest
{
public static void main(String[] args)
{
Proxy proxy=new Proxy();
proxy.Request();
}
}
4、实例分析
初恋这件小事是一部很不错的电影,电影中有个情节是这样的,女主角A通过自己的努力,越来越漂亮了,渐渐吸引了男一B和男二C的注意,男二C主动发起进攻,央求男一A去送礼物。虽然中间颇为周折,最后男女主角相互爱慕,最终走在一起。男二只能为他人做嫁衣了。
用程序去实现,送礼物的过程。
1)女主角A用Girl类去表示。
public class Girl
{
public String name;
public Girl(String name)
{
this.name=name;
}
}
2)用公共的接口IGiveGift来实现送礼物的功能。
public interface IGiveGift
{
void GiveDolls();
void GiveFlowers();
void GiveChocolates();
}
3)男二号C是真实的想送礼物追求的人
public class Persuit implements IGiveGift
{
private Girl girl;
public Persuit(Girl girl)
{
this.girl=girl;
}
@Override
public void GiveDolls()
{
System.out.println("送"+girl.name+"送小熊");
}
@Override
public void GiveFlowers()
{
System.out.println("送"+girl.name+"鲜花");
}
@Override
public void GiveChocolates()
{
System.out.println("送"+girl.name+"巧克力");
}
}
3)男一号B是代理送礼物的人
public class Proxy implements IGiveGift
{
Persuit p;//先定义一个Persuit的引用
public Proxy(Girl girl)
{
p=new Persuit(girl);
}
//通过构造函数初始化Persuit类,实现Persuit类的真实功能。
@Override
public void GiveDolls()
{
p.GiveDolls();
}
@Override
public void GiveFlowers()
{
p.GiveFlowers();
}
@Override
public void GiveChocolates()
{
p.GiveChocolates();
}
}
4)客户端测试代码
<pre name="code" class="java">public class test
{
public static void main(String[] args)
{
Girl girl=new Girl("美女A");
Proxy proxy=new Proxy(girl);
proxy.GiveDolls();
proxy.GiveFlowers();
proxy.GiveChocolates();
}
}