您的位置:首页 > 职场人生

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

2014-04-07 14:35 465 查看

------------------------------------------------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




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: