代理模式

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


 





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值