黑马程序员_代理章节引出的代理模式



------------------------------------------------android培训java培训期待与您交流!-----------------------------------------------

概念
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用

代理模式UML图

代理涉及到的角色

①抽象主题角色(Subject)
声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替
②代理主题角色(Proxy)
含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题.代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作
③真实代理对象(RealSubject)
定义了代理角色所代表的具体对象

普通代理

①代理接口(Subject)

该类描述的是一些公共的方法(送礼物的方法)

//定义代理和真正执行者的共同方法
public interface TransmitGift
{
	//送布娃娃
	public void transmitDolls();
	//送巧克力
	public void transmitChocolate();
}

②代理类(Proxy)

//帮张三进行代理送东西的王五
public class Proxy implements TransmitGift
{
	//保留有一个张三的引用对象
	ZhangSan zhangSan;
	public Proxy(Girl girl)
	{
		zhangSan=new ZhangSan(girl);
	}
	@Override
	public void transmitDolls()
	{
		zhangSan.transmitDolls();
	}
	@Override
	public void transmitChocolate()
	{
		zhangSan.transmitChocolate();
	}
}

③张三(RealSubject)被代理者

//实际追求者
public class ZhangSan implements TransmitGift
{

	Girl girl;
	public ZhangSan(Girl girl)
	{
		this.girl = girl;
	}
	@Override
	public void transmitDolls()
	{
		System.out.println("送布娃娃给"+girl);
	}
	@Override
	public void transmitChocolate()
	{
		System.out.println("送巧克力给"+girl);
	}
}

④MainClass主函数

public class MainClass
{
	public static void main(String[] args)
	{
		Girl girl=new Girl("娇娇");
		//本来娇娇不认识张三,但通过王五这个代理
		Proxy wangWu=new Proxy(girl);
		wangWu.transmitDolls();
		wangWu.transmitChocolate();
	}
}

❹动态代理

先生成一个创建代理的工厂类,其中target代表要被代理的对象,Advice是需要向代理类做的事情

public class ProxyFactory 
{
	public static Object getProxy(final Object target,final Advice advice) {
		Object proxy = Proxy.newProxyInstance(
				target.getClass().getClassLoader(),
				target.getClass().getInterfaces(),
				new InvocationHandler(){
					public Object invoke(Object proxy, Method method, Object[] args)
							throws Throwable {
						advice.doSomething();
						Object retVal = method.invoke(target, args);
						return retVal;						
					}
				}
				);
		return proxy;
	}
}

建议类

public interface Advice
{
	public void doSomething();
}
建议实现类
public class MyAdvice implements Advice
{
	@Override
	public void doSomething()
	{
		System.out.println("下次还是自己去送东西把这样更诚意");
	}
}

测试类

TransmitGift transmitGift=(TransmitGift) ProxyFactory.getProxy(new ZhangSan(girl),new MyAdvice());
		transmitGift.transmitChocolate();
		transmitGift.transmitDolls();

结果:


下次还是自己去送东西把这样更诚意
送巧克力给娇娇
下次还是自己去送东西把这样更诚意
送布娃娃给娇娇

-----------------------------------------android培训java培训、java学习型技术博客、期待与您交流! --------------------------


详情请查看:http://edu.csdn.net/heima




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值