动态代理混合

用动态代理可能产生一种比装饰器模式更接近混型模式的机制,用动态代理,产生的类型就是已经被混合后产生的组合类型。由于动态代理的限制,每个参与混型的类都必须实现某个或某些接口。

class MixinProxy implements InvocationHandler{

  Map<String,Object> delegatesByMethod;

  public MinxinProxy(TwoTuple<Object,Class<?>>...pairs){

     delegatesByMethod = new HashMap<String,Object>();

     for(TwoTuple<Object,Class<?>> pair : pairs){

        for(Method method:pair.second.getMethods()){

          String methodName = method.getName();

          //The first interface in the map implements the method

         if(!delegatesByMethod.containsKey(methodName)){

             delegatesByMethod.put(methodeName,pair.first);

         }

       }

     }

  }

  public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{

     String methodName = method.getName();

     Object delegate = delegatesByMethod.get(methodName);

     return method.invoke(delegate,args);

 }

 public static Object newInstance(TwoTuple...pairs){

     Class[] interfaces = new Class[pairs.length];

     for(int i = 0; i < pairs.length; i++){

         interfaces[i] = (Class)pairs[i].second;

     }

     ClassLoader cl = pairs[0].first.getClass().getClassLoader();

     return Proxy.newProxyInstance(cl,interfaces,new MixinProxy(pairs));

   }

   public class DynamicProxyMixin{

      public static void main(String[] args){

       Object mixin = MixinProxy.newInstance(tuple(new BasicImp(),Basic.class),tuple(new TimeStampedImp(),TimeStamped.class),tuple(new SerialNumberedImp(),SerialNumber.class));

      Basic b = (Basic)mixin;

      TimeStamped t = (TimeStamped)mixin;

      SerialNumbered s = (SerialNumbered)mixin;

      b.set("hello");

     System.out.println(b.get());

     System.out.println(t.getStamp());

     System.out.println(s.getSerialNumer());

   }

}/*output:

Hello

1132519137015

1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值