内容:
- Observerパターン
- プロキシモード
Observerパターン:
Javaは、独自のオブザーバーパターン>>> java.util.Observableを実装します。
1、公共同期無効addObserver(オブザーバー0);オブザーバーを追加
2、公共同期無効deleteObserver(オブザーバー0);オブザーバーを削除
図3は、保護された同期ボイド()はsetChanged;物体を観察者が見ることができるように変更通知タグは、変更がことを覚え
4、公共ボイドnotifyObservers(オブジェクト引数);通知オブザーバ、変更された観察され
1 パブリック クラスObserverDemo { 2 3。 公共 静的 ボイドメイン(文字列[]引数){ 4。 // 観察対象 5。 MyObservable OBS = 新しい新しいMyObservable(); 6 。7 // オブザーバを追加 。8 obs.addObserver((O、アルギニン) - >のSystem.out.println( "サービスリストを変更1:" + アルギニン)); 9。 10 オブザーバーO =(O1、アルギニン) -のSystem.out.println(> "サービスリスト2を変更されました:" + アルギニン); 11 obs.addObserver(O)、 12は 13である obs.setServerList( "192.168.110.1" ); 14 15 obs.deleteObserver(O) 16 obs.setServerList( "192.168.110.2" )。 17 } 18 } 19 20 クラス MyObservableは延び観測{ 21 22 公共 ボイドsetServerList(文字列いるserverList){ 23 この.setChangedを(); 24 この.notifyObservers(いるserverList)。 25 } 26 }
プロキシモード:
1、帯電防止剤
代理店は、ブローカーに物事を取るような広告や他の星のように、自身が行うには、エージェントのコアビジネスの外で行われる必要があるタスクに加えています。
1つの パブリック クラスクライアント{ 2 公共 静的 ボイドメイン(文字列[]引数){ 3 教師教師= 新しい ProxyDemo(新しいMathTeacher())。 4 teacher.teach(); 5 } 6 } 7 8 クラス ProxyDemoが実装教師{ 9 プライベート教師教師。 10 11 公共ProxyDemo(教師教師){ 12 この .teacher = 教師。 13 } 14 15 @Override 16 公共 ボイド教示(){ 17 の前に(); 18 teacher.teach()。 19 後(); 20 } 21 22 公共 ボイド(){前 23 System.err.println( "准备资料..." )。 24 } 25 26 公共 ボイド(){後 27 System.err.println( "布置作业..." )。 28 } 29 } 30 31 インターフェイス教師{ 32 ボイド教示(); 33 } 34 35 クラス MathTeacherが実装教師{ 36 @Override 37 公共 ボイド教示(){ 38 System.err.println( "上数学课"を)。 39 } 40 }
欠点は、これは非常に退屈で反復的である、静的なエージェントをプロキシにオブジェクトを必要とする場合は、コードは再び重い取得する必要があるということであるので、動的プロキシが存在します。
2、動的プロキシ
1つの パブリック クラスクライアント{ 2 公共 静的 ボイドメイン(文字列[]引数){ 3 ダイナミックダイナミック= 新しい動的(新しいMathTeacher())。 4 教師mathTeacher = (教師)dynamic.getProxyInstance(); 5 mathTeacher.teach()。 6 7 System.err.println( "-----------------------" )。 8 9 ダイナミックdynamic2 = 新しい動的(新しいEnglishTeacher())。 10 教師mathTeacher2 =(教師)dynamic2.getProxyInstance(); 11 mathTeacher2.teach(); 12 } 13 } 14 15 クラス動的実装のInvocationHandler { 16 プライベートオブジェクトターゲットを、 17 18 公共動的(オブジェクト・ターゲット){ 19 この = .TARGET ターゲット。 20 } 21 22 公共 ボイド(){前 23 のSystem.out.println( "准备资料..." )。 24 } 25 26 公共 ボイド後(){ 27 のSystem.out.println( "布置作业..." ); 28 } 29 30 @Override 31 パブリックオブジェクトを呼び出し(オブジェクトプロキシ、方法方法、[]引数オブジェクト)スローのThrowable { 32 )(前。 33 オブジェクト結果= method.invoke(ターゲット、引数)。 34 後(); 35 リターン結果; 36 } 37 38 パブリックオブジェクトgetProxyInstance(){ 39 リターンたとえば、Proxy.newProxyInstance(target.getClass()のgetClassLoader()、target.getClass()でgetInterfaces()、この); 40 } 41 } 42 43 インターフェイス教師{ 44 ボイド教示(); 45 } 46 47 クラス MathTeacherが実装教師{ 48 @Override 49 公共 ボイド教示(){ 50 のSystem.out.println( "上数学课"を)。 51 } 52 } 53 54 クラス EnglishTeacherが実装教師{ 55 @Override 56 公共 ボイド(){教える 57で のSystem.out.println( "英語クラス" ); 58 } 59 }