设计模式之代理模式

1.概念

   代理模式就是为对象提供一种代理以控制对这个对象的访问。简而言之,就是用一个对象来代替另外一个对象来控制该对象的访问权限。

2.代理模式的设计实例

 代理模式的UML类图如下:



以一个实例为例,小张(代理)帮助小马追求小红,代码实现如下:

 通用接口类Subject.java如下:

package com.uestc.proxy;

public interface Subject {
	public void operatorA();
	public void operatorB();
	public void operatorC();
}
小红类Schoolgirl.java如下:

package com.uestc.proxy;

public class Schoolgirl {
	private String name;
	public void setName(String name){
		this.name=name;
	}
	public String getName(){
		return this.name;
	}

}

追求者小马类ConcreteSubject.java代表Proxy类操作的真实实体如下:

package com.uestc.proxy;

public class ConcreteSubject implements Subject {
	Schoolgirl girl;
	public ConcreteSubject(Schoolgirl girl){
		this.girl=girl;
	}
	@Override
	public void operatorA() {
		System.out.println(girl.getName()+"收到了玫瑰!");
	}

	@Override
	public void operatorB() {
		System.out.println(girl.getName()+"收到了巧克力!");
	}

	@Override
	public void operatorC() {
		System.out.println(girl.getName()+"收到了情書!");
	}

}
代理类,保存了一个引用使得代理可以访问实体,并提供一个与Subject想同的接口,代码Proxy.java如下:

package com.uestc.proxy;

public class Proxy implements Subject {
	private ConcreteSubject subject;
	public Proxy(Schoolgirl girl){
		subject=new ConcreteSubject(girl);
	}

	@Override
	public void operatorA() {
		subject.operatorA();
	}

	@Override
	public void operatorB() {
		subject.operatorB();
	}

	@Override
	public void operatorC() {
		subject.operatorC();
	}

}
运行主类Test.java如下:

package com.main;

import com.uestc.proxy.Proxy;
import com.uestc.proxy.Schoolgirl;

public class Test {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Schoolgirl girl=new Schoolgirl();
		girl.setName("小紅");
		Proxy proxy=new Proxy(girl);//礼物送给小红
		proxy.operatorA();
		proxy.operatorB();
		proxy.operatorC();
	}

}
运行结果如下:


小紅收到了玫瑰!
小紅收到了巧克力!
小紅收到了情書!


   另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个 代理角色,如果大量使用会导致类的急剧膨胀;因此,以上的代理使用方式成为静态代理,此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。动态代理可以让系统能够根据实际需要来动态创建代理类,让同一个代理类能够代理多个不同的真实主题类而且可以代理不同的方法。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值