`

委托代理模式

阅读更多

委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。委托模式使得我们可以用聚合来替代继承,它还使我们可以模拟mixin。   

 

“委托”在C#中是一个语言级特性,而在Java语言中没有直接的对应,但是我们可以通过动态代理来实现委托!

 

代理有3个角色

 

1:抽象主题角色.声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替.

2:代理主题角色.含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题.代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作.

3:真实代理对象.定义了代理角色所代表的具体对象.

 

如示例

 

/**  

*抽象主题角色,定义了真实角色和代理角色的公共接口  

*/  

public interface SellInterface{   

     public Object sell();   

}  

 

/**  

*真实主题角色,这里指红酒工厂角色,它实现了SellInterface接口  

*/  

public class RedWineFactory implements SellInterface{   

     public Object sell(){   

         System.out.println("真实主题角色RedWineFactory 被调用了");   

         return new Object();   

     }   

}  

 

/**  

*代理主题角色,这里指红酒代理商.它除了也要实现了sellInterface接口外,还持有红酒  

*厂商RedWineFactory 对象的引用,从而使它能在调用真实主题前后做一些必要处理.  

*/  

public class RedWineProxy implements SellInterface{   

     //持有一个RedWineFactory对象的引用   

      private RedWineFactory redWineFactory;   

  

     //销售总量   

      private static int sell_count = 0;   

  

     public Object sell(){     

             Object obj = redWineFactory.sell();   

             count ++;//同样,在调用后我们也可以执行一些额外的动作.   

             return obj ;    

     }   

 

public static void main(String agr[])   

{   

     SellInterface sell = new RedWineProxy();   

     sell.sell();   

}  

从上面的例子可以看出代理模式的工作方式,首先,因为代理主题和真实主题都实现了共同的接口,这使我们可以在不改变原来接口的情况下,只要用真实主题对象的地方,都可以用代理主题来代替.其次,代理主题在客户和真实主题之间起了一个中介作用,利用这个中介平台,我们可以在把客户请求传递给真实主题之前,做一些必要的预处理.

 

上面的代理,我们强迫代理类RedWineProxy实现了抽象接口SellInterface.这导致我们的代理类无法通用于其他接口,所以不得不为每一个接口实现一个代理类.幸好,java为代理模式提供了支持.
java主要是通过Proxy类和InvocationHandler接口来给实现对代理模式的支持的.

 

具体可以查看动态代理

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    物流金融服务模式博弈的委托代理分析

    物流金融服务模式博弈的委托代理分析,包玉梅,,本文从物流金融服务模式的角度分析了第三方物流、融资企业、商业银行之间的委托代理关系,即第三方物流和融资企业之间、第三方物

    委托模式详细讲解(委托)

    关于委托模式详细讲解(委托),主要举例说明..

    用Java动态代理实现委托模式

    NULL 博文链接:https://lgstarzkhl.iteye.com/blog/606242

    IOS 设计模式委托模式实例Demo

    IOS 设计模式委托模式实例Demo 设计 模式 IOS 代理 委托

    观察者模式Vs事件委托Demo

    java 观察者模式 事件委托

    基于委托代理理论视角的养老保险筹资模式研究.docx

    基于委托代理理论视角的养老保险筹资模式研究.docx

    VB.Net-C#多线程Thread-代理委托delegate编程

    最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt C#多线程编程-多细全.txt C#多线程编程简单实例.txt C#多线程窗体控件安全访问....

    CAS代理模式

    Yale CAS proxy authentication. 博文链接:https://iroyce.iteye.com/blog/101899

    java静态代理与动态代理

     代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个...

    iOS设计模式——委托(delegate)例子

    代码实现代理模式。具体文章简介可以参考博文:http://blog.csdn.net/lovefqing/article/details/8270111

    java动态代理实现与原理详细分析.docx

     代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理...

    举例讲解Python设计模式编程的代理模式与抽象工厂模式

    代理模式 Proxy模式是一种常用的设计模式,它主要用来通过一个对象(比如B)给一个对象(比如A) 提供’代理’的方式方式访问。比如一个对象不方便直接引用,代理就在这个对象和访问者之间做了中介 你先设想:一个对象...

    iOS代理模式

    教你简单快速的理解什么是代理模式,清晰的6步骤让你对iOS中代理模式的理解更加的深入,让你能够更好的运用代理设计模式,帮助你绿清代理的思路,适合小白认知和掌握代理模式!

    cgLib与JDK动态代理的用法

    代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类...

    php设计模式之委托模式

    委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个...被委托的接口/类应该满足如下条件:动态委托最多只能委托一个类,但是能够代理多个接口。这个限制来自于Java的单继承模式。一个

    python 实现 设计模式

    python 实现 代理模式 python 实现 工厂模式 python 实现 观察者模式1(双向耦合) python 实现 观察者模式2(抽象观察者) python 实现 观察者模式3(双向解耦 抽象观察者,抽象通知者) python 实现 观察者模式4...

    基于博弈视角的煤炭企业绿色矿山建设研究

    首先,通过构建四阶段博弈模型,解释了这种委托代理模式中存在的主要矛盾;其次,分析博弈过程中影响三者行为的主要因素以及这些因素在绿色矿山建设过程中的影响和关系;最后分析得出结论,解释了煤炭绿色矿山建设进展缓慢...

    SuperMap iMobile for iOS 锁定地图比例尺

    这是一个简单的工程,通过锁定地图最大比例尺操作,介绍iOS的委托代理模式的一个简单应用。范例中,ViewController实现了MapParameterChangedDelegate协议,在scaleChanged方法中控制地图的最大比例尺。

    延长劳动时间的薪酬与激励设计

    延长劳动时间的薪酬与激励设计,梁阳,汪安佑,加班是现代企业中一个比较常见的现象。本文受到几个重要案例的启示,利用基数效用分析、消费者剩余分析、委托代理模式分析等经济

    java静态代理和动态代理详解

    在代理模式中,主要有两种类型:静态代理和动态代理。 1.静态代理: 静态代理是指在编译期间就已经确定代理类和被代理类的关系,需要手动编写代理类。代理类需要实现与被代理类相同的接口,并且在代理类中持有一个被...

Global site tag (gtag.js) - Google Analytics