委托代理模式

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

 

具体可以查看动态代理

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值