c#委托与java处理

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。“委托”在C#中是一个语言级特性,是C#语言的动态拓展能力。而在Java语言中没有直接的对应,但是我们可以通过动态代理来实现委托

   (一)  C#下委托代理方式:

/**将方法作为方法的参数

*/

  publicdelegatevoidGreetingDelegate(string name);

      private static voidChineseGreeting(string name)

 private static voidEnglishGreeting(string name)

   private static void GreetPeople(string name,GreetingDelegate MakeGreeting) {
              MakeGreeting(name);
            }

static void Main(string[] args) {
              GreetPeople("Geogre ", EnglishGreeting);
              GreetPeople("陌上桑", ChineseGreeting);

}

 /***将方法绑定到委托

*/

static void Main(string[]args) {
    GreetingDelegate delegate1= new GreetingDelegate(EnglishGreeting);
    delegate1 += ChineseGreeting;   // 给此委托变量再绑定一个方法   

// 将先后调用 EnglishGreeting ChineseGreeting方法
    GreetPeople("Geogre", delegate1); 
    Console.WriteLine();   delegate1 -= EnglishGreeting;//取消对EnglishGreeting方法的绑定
    // 将仅调用 ChineseGreeting
    GreetPeople("陌上桑", delegate1);
    Console.ReadKey();
}
输出为:
Morning, Geogre
早上好, Geogre
早上好, 陌上桑




(二) Java下动态代理来实现委托

public abstract class Delegator implementsInvocationHandler {
protected Object obj_orgin = null; //原始对象

protected Object obj_proxy = null; //代理对象

// 完成原始对象和委托对象的实例化
 public  Delegator(Objectorgin) {
        this.createProxy(orgin);
    }

protected Object createProxy(Object orgin) {
        obj_orgin = orgin;

//下面语句中orgin.getClass().getClassLoader()为加载器, orgin.getClass().getInterfaces()为接口集class对象
        obj_proxy = Proxy.newProxyInstance(orgin.getClass().getClassLoader(),orgin.getClass().getInterfaces(), this);//委托
        return obj_proxy;
    }

    /*
     * 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法,具体请参见
     */
    protected Object invokeSuper(Methodmethod, Object[] args) throws Throwable {
        return method.invoke(obj_orgin,args);
    }
   //--------------实现InvocationHandler接口,要求覆盖------------
    //下面实现的方法是当委托的类调用toString()方法时,操作其他方法而不是该类默认的toString(),这个类的其他方法则不会。

    public Object invoke(Object obj,Method method, Object[] args) throws Throwable {
        // 缺省实现:委托给obj_orgin完成对应的操作
        if(method.getName().equals("toString")) {

//对其做额外处理
            returnthis.invokeSuper(method, args) + "$Proxy";
        } else {

//注意,调用原始对象的方法,而不是代理的(obj==obj_proxy

           return this.invokeSuper(method, args);
        }
    }
}





                                                                                        (    --------     整理相关资源,若有版权问题,请及时沟通)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值