深入浅出学习设计模式之代理模式《三》

为他人做嫁衣

小明    男       

小龙    男

小红    女

大学里,小龙学习成绩好,经常给小红补课,而小明跟小龙是好朋友,小明想追求小红,就每次委托小龙给小红代送礼物,久而久之,小红喜欢上了小龙,却把经常送礼物的小明给抛弃了,小明的做法到头来却给别人做了嫁衣

这个故事用java中的模式来解释,就是代理模式

小龙和小明都有送礼物的方法,所以把送礼物的动作提出来为一个接口,而小龙(代理)送的礼物实际上是来自于小明(追求者),

上代码

1.定义一个送礼物的接口GiveGift

/**
 * 定义一个送礼的接口
 * @author Administrator
 *
 */
public interface GiveGift {

	public void GiveDolls();
	public void GiveFlowers();
	public void GiveChocolate();
}

2.定义一个mm(小红)

/**
 * 被追对象
 * @author Administrator
 *
 */
public class Girl {

	
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}

3.定义一个追求者Pursuit实现送礼接口

/**
 * 追求者
 * @author Administrator
 *
 */
public class Pursuit implements GiveGift {

	public Girl mm;
	
	/**
	 * 构造方法 给mm送礼,对象是mm
	 * @param mm
	 */
	public Pursuit(Girl mm) {
		this.mm = mm;
	}
	
	@Override
	public void GiveDolls() {

		System.out.println("小明送的狗熊");
	}

	@Override
	public void GiveFlowers() {
		System.out.println("小明送的玫瑰");
	}

	@Override
	public void GiveChocolate() {
		System.out.println("小明送的巧克力");
	}

}

4.代理者(小龙)也有送礼的动作实现送礼接口

/**
 * 代理者
 * @author Administrator
 *
 */
public class Proxy implements GiveGift{

	public Pursuit gg;
	
	/**
	 * 构造方法 代小明给mm送礼,对象是mm
	 * @param mm
	 */
	public Proxy(Girl mm) {
		gg = new Pursuit(mm);
	}
	@Override
	public void GiveDolls() {
		gg.GiveDolls();
	}

	@Override
	public void GiveFlowers() {
		gg.GiveFlowers();
	}

	@Override
	public void GiveChocolate() {
		gg.GiveChocolate();
	}
}

5.测试

public class Test {

	public static void main(String[] args) {

		Girl mm = new Girl();
		mm.setName("小红");
		//小龙(代理者)给小红送礼物
		//事实上送的礼物是小明的
		Proxy xl = new Proxy(mm);
		xl.GiveDolls();
		xl.GiveFlowers();
		xl.GiveChocolate();
	}

}

测试结果,在测试时,创建代理者给mm送礼,事实上送的礼物都是小明送的,,这种方式就是代理模式,对于小红而言,不需要知道追求她的人是谁,却可以通过代理人得到礼物

代理模式  为其他对象通过一种代理以控制对这个对象的访问

Subject 类定义了RealSubject和Proxy公用的接口,这样就在任何使用RealSubject的地方都可以使用Prox

1.定义一个抽象类

public abstract class Subject {

	public abstract void Request();
}

2.定义一个真实的请求

public class RealSubject extends Subject {

	@Override
	public void Request() {

		System.out.println("真实的访问请求");
	}

}

3.定义一个代理

public class Proxy extends Subject {

	public RealSubject realSubject;
	@Override
	public void Request() {
		if(realSubject ==null){
			realSubject = new RealSubject();
		}
		realSubject.Request();
	}

}

4.测试


public class Test {

	public static void main(String[] args) {
		
		Proxy px = new Proxy();
		px.Request();
		
	}

}

总结一下

代理模式应用的场合

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

2.虚拟代理,根据需要创建开销很大的对象,通过她来存放实例化需要很长时间的真实对象,比如在打开一个很大的HTML网页时,里面有很多文字和图片,你可以很快打开,看到的是所有的文字,但图片确实一张一张的下载后才能看到,那些没打开的图片框,就是通过虚拟代理代替了真实的图片,此时代理存储了真实图片的路径和尺寸

3.安全代理,用来控制真实对象访问是的权限

一般用于对象应该有不同的访问权限的时候

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

 

代理模式实际上就是在访问对象时,可以附加多种用途

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值