プロキシモードのいくつかの小さい例について

4970 ワード

代理の方法は二つあります。
一つは静的な代理方法です。
もう一つはダイナミックな代理方法です。
まず研究したのは静的な代理の方法で、それは主に代理モードの思想を体現しています。
まず、業務を実現するインターフェースを定義します。
public interface UserManager {
     public void setUserName();
     public void setUserPassword();
     public void setAddress();
} 
これらのインターフェースを実装するクラスを定義します。
public class UserManagerImpl implements UserManager {

	@Override
	public void setAddress() {
      System.out.println("-----setAddress Successfully!-------");
	}

	@Override
	public void setUserName() {
	  System.out.println("-----setUserName Successfully!-------");

	}

	@Override
	public void setUserPassword() {
	  System.out.println("-----setUserPassword Successfully!-------");

	}

}
そして、代理店の実現クラスです。代理店である以上、もちろんこれらの業務を実現する必要があるかどうかは代理機能を実現することができません。
public class UserManagerProxy implements UserManager {
        private UserManager  manager; 
        public UserMnaagerProxy(UserManager  manager){
              this.manager = manager 
}
	@Override
	public void setAddress() {
         check();
         manager.setAddress();
	}

	@Override
	public void setUserName() {
	 check();
          this.manager.setUserName();

	}

	@Override
	public void setUserPassword() {
	  check();
          this.manager.setUserPassword();

	}
        public void check(){
            System.out.println("-----check Successfully!-------");
}

}
クライアントのコードは
import org.util.Impl.UserManagerImpl;

import org.util.interfaces.UserManager;

public class UserManagerClient {


	public static void main(String[] args) {
		
		UserManager proxy = new UserManagerProxy(new UserManagerImpl()); 
	       proxy.setAddress();
               proxy.setUserPassword();
	       proxy.setUserName();
	}

}
これは静的代理法です。彼は大きなコード量に適用できないです。つまり、多くの業務方法をチェックする必要があります。これは比較的に面倒ですが、javaのカバンには動的なインプリメンテーションエージェントのパターンがaopの思想を体現しています。
まず彼のインターフェースのコードはインターフェースの業務種類が同じなら書かないと同じです。コードはもう書かないです。
上にあります
それから彼の1つは、動的エージェントクラスに含まれている1つの実装(処理プログラムインターフェースを呼び出す)の実装クラスであり、このエージェントクラスの実装をこのクラスで実行することができます。実は、これは一歩ずつです。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class UserManagerInvoke implements InvocationHandler {
    public Object targetObj ;
    
    public Object newProxy(Object targetObj){
    	this.targetObj = targetObj;
    	/**
    	 *          Proxy  
    	 *         InvocationHandler       
    	 *       Proxy          
    	 *                       AOP  
    	 *          (  InvocationHandler       )
    	 *                     invoke()      
    	 *                        jinvoke()   
    	 */
    	return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),
    			                      targetObj.getClass().getInterfaces(),
    			                      this);
    }
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		// TODO Auto-generated method stub
		checkSecurity();
		Object result = null;
		try{
			result = method.invoke(this.targetObj, args);
		}catch(Exception e ){
		  e.printStackTrace();	
		}
		return result;
	}
	public void checkSecurity(){
		System.out.println("-------checkSecurity Successfully!!!--------");
	}

}
java.lang.reflect.Proxyについての紹介はjdkのapi文書を見てもいいです。ここで詳しくは話しません。
そしてclientのコードです。
import org.util.Impl.UserManagerImpl;
import org.util.aop.UserManagerInvoke;
import org.util.interfaces.UserManager;

public class UserManagerClient {


	public static void main(String[] args) {
		UserManagerInvoke hander = new UserManagerInvoke();
		UserManager proxy = (UserManager) hander.newProxy(new UserManagerImpl());
           // proxy                               
          //  InvocationHandler      invoke();     
	    proxy.setAddress();
	    proxy.setUserPassword();
	    proxy.setUserName();
	}

}
運行の結果は
----checkSecurity Success fully!!-------------
-----------set Address Success fully!-------
----checkSecurity Success fully!!-------------
---------setsUserPassword Success fully!-------
----checkSecurity Success fully!!-------------
---------setsUserName Success fully!-------
比較すると、第二の方法はより柔軟な代理機構があります。aopの切断面の思想も体現しています。