エージェンシーモードのデザインパターン(ダイナミックエージェンシー)

前回の記事では、デザインパターンのプロキシモードの静的プロキシを紹介しました実際のプログラミングでは、静的プロキシモデルはよく理解されています。ただし、通常、動的エージェントがより頻繁に使用されます。主な理由は、どのエージェントが実装フェーズにあるかは問題ではなく、どのエージェントが運用フェーズで指定されているかは問題ではないためです。Javaの有名な春のフレームワークでのAOP指向のプログラミングのアイデアは、動的プロキシに基づいています。
動的プロキシと言えば、インターフェイスInvocationHandlerと言わなければなりませんが、javaAPIドキュメントに紹介があります。
Of InvocationHandlerは、プロキシインスタンスの呼び出しハンドラーによって実装されるインターフェイスです。
各プロキシインスタンスには、関連付けられた呼び出しハンドラーがあります。メソッドがプロキシインスタンスで呼び出されると、メソッド呼び出しはエンコードされ、ITS呼び出しハンドラーの呼び出しメソッドにディスパッチされます。
実質的に意味:プロキシクラスの各インスタンスはハンドラーに関連付けられています。プロキシオブジェクトを介してメソッドを呼び出すと、このメソッドの呼び出しはInvocationHandlerインターフェイスのinvokeメソッドに転送されます。

特定のコードの実装:静的プロキシメソッドと同様に、インターフェイスを作成しました。

public interface ICompany {
	public void signContract(String companyName);
}

このインターフェイスは、実際の実装クラスCompanyによって実装されます。

public class Company implements ICompany {

	@Override
	public void signContract(String companyName) {
		// TODO Auto-generated method stub
		System.out.println("我们签约了"+companyName);
	}
}

上記のように、すべての動的プロキシオブジェクトはハンドラーに関連付ける必要があり、このハンドラーはInvocationHandlerの実装クラスです。

public class ProxyCompanyHandler implements InvocationHandler {
	private ICompany company;
	
	public ProxyCompanyHandler(ICompany company){
		this.company = company;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] arg2) throws Throwable {
		// TODO Auto-generated method stub
		//从侧面切入从而达到扩展的效果的编程,就是面向切面编程(AOP Aspect Oriented Programming)。
	  //AOP并不是新技术,而是相对于面向对象编程的一种新的编程思想。在日志,事务,权限等方面使用较多
		if(method.getName().equals("signContract")){
			System.out.println("这里我们可以拦截方法的执行,我可以动态代理这个对象");
			method.invoke(company, arg2);
		}
		return method.invoke(company, arg2);
	}
}
}

動的プロキシインスタンスを作成するにはどうすればよいですか?Proxy.newProxyInstanceメソッドを使用して動的プロキシインスタンスを作成します。

public class ProxyMain {

	public static void main(String[] args) {
		ICompany tencent = new Company();
		ProxyCompanyHandler handler = new ProxyCompanyHandler(tencent);
		ICompany tencentProxy = (ICompany) Proxy.newProxyInstance(tencent.getClass().getClassLoader(),tencent.getClass().getInterfaces(), handler);
		//此处便实现了对 Company的动态代理。并且生成了代理对象 tencentProxy。如果配合java反射的思想。可以实现很多有意思的代理
		tencentProxy.signContract("阿里巴巴");
	}
}

最終的な実行結果は次のとおりです。
動的プロキシグラフ

実際:Javaリフレクションを使用する場合は、いくつかのプライベートオブジェクトをプロキシできます。たとえば、androidでは、プロキシを介してandroidの起動とアクティビティを傍受できます。[欺瞞]により、リストに登録されていない活動を開始することができます。これは、プラグインフレームワークの重要なアイデアでもあります。全体として、動的エージェントはいくつかの優れたフレームワークで広く使用されています。このデザインパターンは、特定の機能を実装する際にも非常に便利です。

おすすめ

転載: blog.csdn.net/xu_coding/article/details/84204582