JAva設計モードのダイナミックエージェントモード(構造型モード)
5572 ワード
(8).エージェントモード:
記事リンク:http://www.iteye.com/topic/517835
代理モード:あるオブジェクトに代理オブジェクトを提供し、代理オブジェクトによって具体的なオブジェクトの参照を制御する.
エージェントとは、1つのキャラクターが別のキャラクターを代表して行動することを指し、生活の中で、1つのワインメーカーのように、ワインを直接小売する顧客はいません.
すべて代理店を通じて彼の販売業務を完成しました.取引先もワインを飲むために工場を探す必要はありません.彼はメーカーの現地の代理店を見つければいいです.
具体的なワイン工場はそこにあります.お客様は関心を持っていません.代理店が処理します.
エージェント・モードの役割:
1:抽象テーマの役割.エージェントテーマと真実テーマの共通インタフェースを宣言し,真実テーマが必要な場所をエージェントテーマに置き換えることができる.
2:エージェント・トピックの役割.エージェント・トピックの参照が含まれているため、いつでも実際のトピックを操作できます.エージェント・トピックは、実際のトピックと同じインタフェースを提供します.
エージェントトピックは、真実のトピックの参照を持つことによって、いつでも真実のトピックに代わることができます.
実際のトピックの作成または削除を制御するだけでなく、実際のトピックが呼び出される前にブロックしたり、呼び出し後に何らかの操作を行うことができる.
3:リアルエージェント.エージェントロールが表す具体的なオブジェクトを定義する.
JAvaは主にProxyクラスとInvocationHandlerインタフェースを通じてエージェントモードのサポートを実現する.
ブロックメカニズムはエージェントモデルの重要な使用方法の一つであり、
ブロックに加えて、エージェントモードはリソースのロードにもよく使用され、ロードするリソースが大きい場合、実際のトピックロールにバックグラウンドでリソースをロードさせ、エージェントトピックロールにフロントの待機ヒント情報を処理させることができます.
また、エージェントが真実のトピックをブロックできる能力によって、真実のトピックへのアクセス権を制御する権限付与メカニズムもある.
エージェントといえばダイナミックエージェントについてよくお話ししますが、
エージェントが静的であれば、装飾器と変わらないように見えるので、エージェントは常に動的および反射に関連しており、常に言語自体の能力に関係しています.
エージェントモードは通常、既存のオブジェクトに対する制御であり、新しい動作を追加することはありません.例えば、元の動作を追加するか、それとも何をするか、cglibにトランザクションメカニズムを追加するなどよく見られますが、新しい動作を追加することはありません.元のサービスは変わりません.
しかし、装飾モードには通常、新しい動作が加えられ、動作を動的に組み合わせることができ、壁に色を塗ったり、下地を塗ったり、赤を塗ったり、緑を塗ったり、下地を塗ったり、
緑を塗って、赤を塗ってください.
エージェントモードと装飾モードは,新しいクラスで既存のクラスを引用し,既存のクラスの依頼を構成するように構成することができ,これにより既存のクラスを制御することができ,新しい行為を加えたり,他の制御を加えたりすることができる.
しかし、ちょっと疑問ですが、代理者と被代理者は集約関係ですか??集約関係は全体と局部の関係であるが、全体の局部を離れても生存することができる.例えば、空港や飛行機など、
エージェントモードの両者の関係は,user−a関係のように依存関係であるべきであり,依存関係であるからこそ,依存直接注入実装クラスを示すのではなく,インタフェースを用いてデカップリングを行った.
package com.createtype.desginpatterns.dynaicproxyaopimp;
// , aop
// ,
/**
* , ,
*/
public interface AopInterface {
public void before(Object obj);//
public void end(Object obj);//
}
package com.createtype.desginpatterns.dynaicproxyaopimp;
// AopInterface ,
public class AopInterfaceImp implements AopInterface{
public void before(Object obj) {
System.out.println(" ");
}
public void end(Object obj) {
System.out.println(" ");
}
}
package com.createtype.desginpatterns.dynaicproxyaopimp;
public class ImpObject implements SubInterface{
public void add(String value1,String value2) {
System.out.println("ImpObject add(String value1,String value2)");
}
public void acc(String value1){
System.out.println("ImpObject acc(String value1)");
}
}
package com.createtype.desginpatterns.dynaicproxyaopimp;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class PeoxyObject implements InvocationHandler {
private AopInterface aop;//
private Object proxy_obj;
private String methodName;//
PeoxyObject() {
}
public Object factory(Object obj) {
proxy_obj = obj;
Class cls = obj.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(),
cls.getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if (this.aop == null)
throw new NullPointerException("aop is null");
if (method == null)
throw new NullPointerException("method is null");
Object o;
// , ,
//
if (methodName != null && method.toString().indexOf(methodName) != -1) {
aop.before(proxy_obj);//
o = method.invoke(proxy_obj, args);
aop.end(proxy_obj);//
} else {
// ,
o = method.invoke(proxy_obj, args);
}
return o;
}
public AopInterface getAop() {
return aop;
}
public void setAop(AopInterface aop) {
this.aop = aop;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
}
package com.createtype.desginpatterns.dynaicproxyaopimp;
//
public interface SubInterface {
public void add(String value1,String value2);
public void acc(String value1);
}
package com.createtype.desginpatterns.dynaicproxyaopimp;
public class Test {
//
public static void main(String agr[]) {
PeoxyObject po = new PeoxyObject();
po.setAop(new AopInterfaceImp());//
po.setMethodName("acc");//
SubInterface si = (SubInterface) po.factory(new ImpObject());
// add ,AopInterfaceImp
si.add("tt", "dd");
// acc , acc AopInterfaceImp
//
si.acc("tt");
}
}