javaダイナミックエージェントと静的エージェント

4012 ワード

1、スタティックエージェント
a、定義:代理インターフェースがある業務を実現することです。
b、長所:前の業務を基礎として、業務を増やすことができますか?
c、欠陥:一つのタイプの業務のみを代行し、業務方法を増やすと、メンテナンスの複雑さが増します。
具体例:
/**
 * @author
 * @vision createtime:2016  3:00:06
 */
package proxy;

/**
 * @author Administrator
 *
 */
public interface Subject {
	public void study();
}
/**
 * @author
 * @vision createtime:2016  2:59:50
 */
package proxy;

/**
 * @author Administrator
 *
 */
public class Student implements Subject{
	public String name;
	@Override
	public void study() {
		System.out.println(name+"    ");
	}

}
/**
 * @author
 * @vision createtime:2016  3:00:48
 */
package proxy;

/**
 * @author Administrator
 *
 */
public class StaticProxy implements Subject{
	private Subject sub;
	public StaticProxy(Subject sb) {
		this.sub = sb;
	}
	//               
	@Override
	public void study() {
		System.out.println("              ");
		sub.study();
		System.out.println("              ");
	}

}
/**
 * @author
 * @vision createtime:2016  2:59:27
 */
package proxy;

/**
 * @author Administrator
 *       
 */
public class Test {
	public static void main(String[] args) {
		Student stu = new Student();
		stu.name = "    ";
		//   Student  
		StaticProxy sp = new StaticProxy(stu);
		sp.study();
	}
}
このようにして印刷されたものは以下の通りである。
メイン業務を実行する前に増加したい業務のウェイエンさんはメイン業務を実行してから増加する業務を勉強しています。
私たちは開発時に他の業務を増やす必要があるかどうかを選択できます。
2、ダイナミックエージェント
主にInvocationHandlerインターフェースを実現します。
静的エージェントに対しては、プロキシタイプを切り替えることができる。
(注意:動的エージェントであろうと、静的エージェントであろうと、エージェントのオブジェクトはすべてインターフェースである)
具体的なコード:
/**
 * @author
 * @vision createtime:2016  3:17:15
 */
package dynproxy;

/**
 * @author Administrator
 *
 */
public interface StudentSubject {
	public void study();
}
/**
 * @author
 * @vision createtime:2016  3:17:06
 */
package dynproxy;

/**
 * @author Administrator
 *
 */
public interface TeachSubject {
	public void teach();
}
/**
 * @author
 * @vision createtime:2016  3:19:16
 */
package dynproxy;

/**
 * @author Administrator
 *
 */
public class Student implements StudentSubject {

	@Override
	public void study() {
		System.out.println("    ");
	}

}
/**
 * @author
 * @vision createtime:2016  3:19:25
 */
package dynproxy;

/**
 * @author Administrator
 *
 */
public class Teacher implements TeachSubject{
	public String name;
	@Override
	public void teach() {
		System.out.println(name+"    ");
	}

}
/**
 * @author
 * @vision createtime:2016  3:22:11
 */
package dynproxy;

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

/**
 * @author Administrator
 *
 */
public class DynProxy implements InvocationHandler{
	private Object obj;
	public DynProxy(Object obj) {
		this.obj = obj;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("      ");
		Object object = method.invoke(obj, args);
		System.out.println("      ");
		return object;
	}
}
/**
 * @author
 * @vision createtime:2016  3:13:51
 */
package dynproxy;

import java.lang.reflect.Proxy;

/**
 * @author Administrator
 *     
 */
public class Test {
	public static void main(String[] args) {
		Teacher teach = new Teacher();
		teach.name = "  ";
		//         
		DynProxy dp1 = new DynProxy(teach);
		//  DynProxy       (teach)
		TeachSubject ts = (TeachSubject)Proxy.newProxyInstance(teach.getClass().getClassLoader(), teach.getClass().getInterfaces(), dp1);
		ts.teach();
		
		Student stu = new Student();
		DynProxy dp2 = new DynProxy(stu);
		StudentSubject ss = (StudentSubject)Proxy.newProxyInstance(stu.getClass().getClassLoader(), stu.getClass().getInterfaces(), dp2);
		ss.study();
	}
}
このように印刷されたものは、
前に実行していた張三さんは授業後に実行する前に実行する学生の勉強をしてから実行します。
さまざまな業務に対して、フィールドを分けて使うことができます。