JAva設計モード---静的エージェント(単純メモ)
2825 ワード
Javaダイナミックエージェントモードエージェント:1つのロールは、特定の機能を完了するために別のロールを表します.例えば、生产者、中间商、取引先のこの3つの関系の取引先は制品を买って直接生产者と付き合うのではありませんて、制品がどのように発生したのかを知る必要はありませんて、取引先は中间商と付き合うだけで、中间商は制品に対していくつか包装を行って、いくつかのアフターサービスを提供することができます.
エージェント・モードには3つのロールがあります:1.抽象テーマロール2.エージェントのトピックロール3.実際のエージェントロール
次に、静的エージェントの実装について説明します.私は戦車を例に挙げた.
抽象テーマロール:Moveable
エージェントトピックロール:TanktimeProxy
実際の代理オブジェクト:Tank
テスト:
前の例からエージェントトピックロールを見ることができる:TanktimeProxyはTankのmove()メソッドの実行時間の計算を実現し,TanktimeProxy,TankはいずれもMoveableインタフェースを実現し,TanktimeProxyのmove()メソッドを呼び出すことでTankのmove()メソッドの実行時間の計算をTankのmove()メソッドの実行時間の計算を実現することができ,Tankのmove()メソッドではいかなる実装も行わずに,これがエージェントの役割です.エージェント実装時にTanktimeProxy,TankはMoveableインタフェースを実装する必要がある.
次はTanKのmove()メソッドの前後にログを付けたいと思います.
この機能を実現するためにクラスをもう1つ書かなければなりません.
テスト:
このように私はエージェントを通じてTankのmove()メソッドの前後にログと時間統計の機能を加えたが,TanktimeProxy,TanklogProxyともにMoveableインタフェースを実現したためTanklogProxyはTanktimeProxyをエージェントすることができ,逆にTankのエージェント順序を交換することができる.
Tankのmove()メソッド呼び出しの前後により多くの機能を加えたい場合、より多くのエージェントトピックロールを書くかどうかは、コードが肥大化しすぎてメンテナンスが容易ではないので、解決策はありませんか.答えは可能です.エージェントトピックロールを動的に生成し、すべての被エージェントオブジェクトをエージェントすることができます.これが動的エージェントです.
エージェント・モードには3つのロールがあります:1.抽象テーマロール2.エージェントのトピックロール3.実際のエージェントロール
次に、静的エージェントの実装について説明します.私は戦車を例に挙げた.
抽象テーマロール:Moveable
package com.gjy.proxy;
public interface Moveable {
void move();
}
エージェントトピックロール:TanktimeProxy
package com.gjy.proxy;
public class TanktimeProxy implements Moveable{
private Moveable t;
public TanktimeProxy(Moveable t) {
super();
this.t = t;
}
@Override
public void move() {
long time1 = System.currentTimeMillis();
System.out.println("time1="+time1);
t.move();
long time2 = System.currentTimeMillis();
System.out.println("time2="+time2);
System.out.println(" :"+(time2-time1));
}
}
実際の代理オブジェクト:Tank
package com.gjy.proxy;
public class Tank implements Moveable{
@Override
public void move() {
System.out.println("TanK moving........");
}
}
テスト:
package com.gjy.proxy;
public class TestTank {
public static void main(String[] args) {
Tank t = new Tank();
Moveable move = new TanktimeProxy(t);
move.move();
}
}
前の例からエージェントトピックロールを見ることができる:TanktimeProxyはTankのmove()メソッドの実行時間の計算を実現し,TanktimeProxy,TankはいずれもMoveableインタフェースを実現し,TanktimeProxyのmove()メソッドを呼び出すことでTankのmove()メソッドの実行時間の計算をTankのmove()メソッドの実行時間の計算を実現することができ,Tankのmove()メソッドではいかなる実装も行わずに,これがエージェントの役割です.エージェント実装時にTanktimeProxy,TankはMoveableインタフェースを実装する必要がある.
次はTanKのmove()メソッドの前後にログを付けたいと思います.
この機能を実現するためにクラスをもう1つ書かなければなりません.
package com.gjy.proxy;
public class TanklogProxy implements Moveable{
private Moveable t;
public TanklogProxy(Moveable t) {
super();
this.t = t;
}
@Override
public void move() {
System.out.println("start move........");
t.move();
System.out.println("end move......");
}
}
テスト:
package com.gjy.proxy;
public class TestTank {
public static void main(String[] args) {
Tank t = new Tank();
Moveable move = new TanktimeProxy(t);
Moveable movet = new TanklogProxy(move);
movet.move();
}
}
このように私はエージェントを通じてTankのmove()メソッドの前後にログと時間統計の機能を加えたが,TanktimeProxy,TanklogProxyともにMoveableインタフェースを実現したためTanklogProxyはTanktimeProxyをエージェントすることができ,逆にTankのエージェント順序を交換することができる.
Tankのmove()メソッド呼び出しの前後により多くの機能を加えたい場合、より多くのエージェントトピックロールを書くかどうかは、コードが肥大化しすぎてメンテナンスが容易ではないので、解決策はありませんか.答えは可能です.エージェントトピックロールを動的に生成し、すべての被エージェントオブジェクトをエージェントすることができます.これが動的エージェントです.