设计模式 —— 代理模式

代理模式

代理模式:为其他对象提供一种代理以控制对这个对象的访问。代理为真实对象的代表
在这里插入图片描述实例:追求者案例
源代码1:无代理模式

package org.zangyu.Agency;

public class Agency {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SchoolGirl jiaojiao =new SchoolGirl();//创建被追求者
		jiaojiao.setName("李娇娇");//初始化被追求者
		Pursuit zhuojiayi =new Pursuit(jiaojiao);//初始化追求者
		zhuojiayi.GiveDolls();//追求方式
		zhuojiayi.GiveFlowers();
		zhuojiayi.GiveChocolate();
	}

}
class Pursuit
{//追求者
	SchoolGirl mm;//追求对象
	public Pursuit(SchoolGirl mm)
	{
		this.mm=mm;
	}
	//追求方式
	public void GiveDolls()
	{
		System.out.println(mm.getName()+"送你洋娃娃");
	}
	public void GiveFlowers()
	{
		System.out.println(mm.getName()+"送你花");
	}
	public void GiveChocolate()
	{
		System.out.println(mm.getName()+"送你巧克力");
	}
}
class SchoolGirl
{//被追求者
	private String name;
	public String getName()
	{
		return name;
	}
	public void setName(String value)
	{
		name=value;
	}
}

该场景的前提:
卓贾易喜欢娇娇,但是,娇娇不认识卓贾易
1.卓贾易给娇娇送花,送巧克力,送洋娃娃
2.卓贾易也可以找一个人,让这个人把鲜花,巧克力和洋娃娃送给娇娇。
两种方式,同一种目的。

源代码2:带有代理者

package org.zangyu.Agency;

public class Agency1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SchoolGirl jiaojiao =new SchoolGirl();//创建被追求者
		jiaojiao.setName("李娇娇");//初始化被追求者
		Proxy zhuojiayi =new Proxy(jiaojiao);//初始化追求者
		zhuojiayi.GiveDolls();//追求方式
		zhuojiayi.GiveFlowers();
		zhuojiayi.GiveChocolate();
	}

}
class Proxy
{//代理者
	SchoolGirl mm;
	public Proxy(SchoolGirl mm)
	{
		this.mm=mm;
	}
	//追求方式
		public void GiveDolls()
		{
			System.out.println(mm.getName()+"送你洋娃娃");
		}
		public void GiveFlowers()
		{
			System.out.println(mm.getName()+"送你花");
		}
		public void GiveChocolate()
		{
			System.out.println(mm.getName()+"送你巧克力");
		}
}
class Pursuit
{//追求者
	SchoolGirl mm;//追求对象
	public Pursuit(SchoolGirl mm)
	{
		this.mm=mm;
	}
	//追求方式
	public void GiveDolls()
	{
		System.out.println(mm.getName()+"送你洋娃娃");
	}
	public void GiveFlowers()
	{
		System.out.println(mm.getName()+"送你花");
	}
	public void GiveChocolate()
	{
		System.out.println(mm.getName()+"送你巧克力");
	}
}
class SchoolGirl
{//被追求者
	private String name;
	public String getName()
	{
		return name;
	}
	public void setName(String value)
	{
		name=value;
	}
}

代理者变追求者,被追求者错认为是代理者在追求她
改进——代理模式

package org.zangyu.Agency;

public class Agency20 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SchoolGirl jiaojiao =new SchoolGirl();//创建被追求者
		jiaojiao.setName("李娇娇");//初始化被追求者
		Proxy agency =new Proxy(jiaojiao);//初始化代理者
		agency.GiveDolls();//代理者传达追求者的追求方式
		agency.GiveFlowers();
		agency.GiveChocolate();
	}

}
interface IGiveGift
{//追求方法接口
	void GiveDolls();
	void GiveFlowers();
	void GiveChocolate();
}
class Proxy implements IGiveGift
{//代理者
	Pursuit gg;
	public Proxy(SchoolGirl mm)
	{
		gg=new Pursuit(mm);
	}
	//代理负责送礼物以追求者的名义
		public void GiveDolls()
		{
			gg.GiveDolls();
		}
		public void GiveFlowers()
		{
			gg.GiveFlowers();
		}
		public void GiveChocolate()
		{
			gg.GiveChocolate();
		}
}
class Pursuit implements IGiveGift
{//追求者
	SchoolGirl mm;//追求对象
	public Pursuit(SchoolGirl mm)
	{
		this.mm=mm;
	}
	//追求方式
	public void GiveDolls()
	{
		System.out.println(mm.getName()+"送你洋娃娃");
	}
	public void GiveFlowers()
	{
		System.out.println(mm.getName()+"送你花");
	}
	public void GiveChocolate()
	{
		System.out.println(mm.getName()+"送你巧克力");
	}
}
class SchoolGirl
{//被追求者
	private String name;
	public String getName()
	{
		return name;
	}
	public void setName(String value)
	{
		name=value;
	}
}

让代理以追求者的名义去展开追求

代理模式架构:

package org.zangyu.Agency;

public class Agency30 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Proxy proxy =new Proxy();//代理人
		proxy.Request();//发送请求
	}

}
abstract class Subject
{
	public abstract void Request();
}
class Proxy extends Subject
{//代理者
	RealSubject real;
	@Override
	public void Request() {
		// TODO Auto-generated method stub
		if(real==null)//初始化代理人
		{
			real= new RealSubject();
		}
		real.Request();//按照代理人发送请求
	}
}
class RealSubject extends Subject
{

	@Override
	public void Request() {
		// TODO Auto-generated method stub
		System.out.println("真实请求");
	}
	
}
**``应用场合:**

1、远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。(找代理,代理人)

2、虚拟代理,是根据需要创建开销很大的对象。通过他来存放实例化需要很长时间的真实对象。

3、安全代理,用来控制真实对象访问时的权限。

4、智能引导,是指当调用真实的对象时,代理处理另外一些事。

代理模式其实就是在访问对象时引入一定程度的间接性,借此附加多种功能。

发布了13 篇原创文章 · 获赞 3 · 访问量 219

猜你喜欢

转载自blog.csdn.net/Yu_Nan___/article/details/105662461