JAVA-ダイナミックエージェント実現(インターフェース実現)

9193 ワード

まずダイナミックエージェントを紹介します。
  • 通俗的には、メーカーに代わって商品を販売し、メーカーに委託して代理販売しています。
  • 次のシーンを紹介します
  • ○工場は商品を生産して、代理店は工場から製品を持って行きます。代理店から商品を買います。この時、代理店は二十パーセントの利益を回収します。
    次のコード部分:
  • まずインタフェースを作ります。あるべき商品は販売とアフターサービスです。
    	
    	package com.Proxy;
    
    	public interface IProducer {
    	    //    
    	    public void saleProduct(float money);
    	
    	    //  
    	    public void afterService(float money);
    	}
    
  • は次に具体的な製品類を作成し、上記インターフェース
  • を実現する。
    	package com.Proxy;
    
    	public class Producer implements IProducer {
    
        //  
        public void saleProduct(float money){
            System.out.println("    ,    "+money);
        }
    
        //  
        public void afterService(float money){
            System.out.println("      ,    "+money);
        }
    }
    
  • 最後に、私たちは消費者を模擬し、製品を消費し、代理対象を作成します。
    	public class Client {
        public static void main(String[] args) {
        Producer producer = new Producer();
    
            //      :Proxy   newProxyInstance  ,            
            //newProxyInstance    
            /**
             *  ClassLoader :           (    )
             *  Class[] :                 
             *  InvocationHandle :         ,            ,            ,     
             */
            IProducer proxyProducter = (IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(),
                    producer.getClass().getInterfaces(), new InvocationHandler() {
                        /**
                         *   :                    
                         * @param proxy          
                         * @param method         
                         * @param args               
                         * @return                     
                         * @throws Throwable
                         */
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            //    
                            //1.        
                            Object returnValue = null;
                            Float money = (float) args[0];
                            if("saleProduct".equals(method.getName())){
                            	//      ,     
                                returnValue = method.invoke(producer,money*0.8f);
                            }
                            return returnValue;
                        }
                    });
            proxyProducter.saleProduct(100000f);
        	}
        }