黑马程序员_代理章节引出的代理模式
2014-04-07 14:35
465 查看
------------------------------------------------android培训、java培训、期待与您交流!-----------------------------------------------
❶概念
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用
❷代理模式UML图
❸代理涉及到的角色
①抽象主题角色(Subject)
声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替
②代理主题角色(Proxy)
含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题.代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作
③真实代理对象(RealSubject)
定义了代理角色所代表的具体对象
❸普通代理
①代理接口(Subject)
该类描述的是一些公共的方法(送礼物的方法)
②代理类(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)被代理者
④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;
}
}
建议类
测试类
结果:
下次还是自己去送东西把这样更诚意
送巧克力给娇娇
下次还是自己去送东西把这样更诚意
送布娃娃给娇娇
-----------------------------------------android培训、java培训、java学习型技术博客、期待与您交流! --------------------------
详情请查看:http://edu.csdn.net/heima
------------------------------------------------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
相关文章推荐
- 黑马程序员-代理模式总结
- 黑马程序员——Java的代理模式
- 黑马程序员——入学Blog05----OC的protocol与代理模式
- 黑马程序员--设计模式之代理模式 02
- 黑马程序员 JDBC_通过代理模式来保持用户关闭连接的习惯,代理设计模式(李勇老师)
- <黑马程序员>代理模式总结-仿制简单spring框架
- 黑马程序员—动态代理模式
- 黑马程序员:Java基础总结----静态代理模式&动态代理
- 方法调用黑马程序员_代理模式之动态代理
- 黑马程序员 oc随记 协议与代理模式
- 黑马程序员------[Objective-C]协议-代理设计模式
- 黑马程序员------基础UI学习中代理模式的认识
- 黑马程序员—IOS加强视频—利用协议实现代理模式
- 黑马程序员——10、OC语言(block、protocol和代理模式)
- 黑马程序员:Java基础总结----静态代理模式&动态代理
- 黑马程序员--OC学习笔记之代理模式的简单分析
- 《尚学堂_史上最易懂的设计模式视频》--章节5 动态代理-JDK6自带的编译器
- 黑马程序员——protocol的基本使用和代理设计模式
- Mysql 连接池调用完成后close代理方法引出的设计模式
- 黑马程序员_代理设计模式