オープンソースのフレームワークのソースコードを学習、お互いを無視面接で予約ポイント外の知識に加えて、私が最も重要なことは、スケーラビリティを行うというようにするにはどのように単一の責任を、実行する方法を、偉大な神というコードの書き方を学ぶことだと思います。。。
マニュアル慎重キャッシュモジュール内の装飾パターンの使用をMyBatisのものを要約しようとします。
それは装飾的なパターンに来るときおそらく、装飾模様がサイド追跡4つの役割によるであろうが、私は、これらはチェダン、台本なし不可欠だと思い、私はmyabtisフレームワークは完全に装飾的なパターンではないと思いますが、一つはバリエーションバージョンであると言うかもしれません。
実際に、私は何のためにデザインパターンの多くは複数のインターフェイスとプログラミング・インターフェースの組み合わせよりも何も引用していない!と思います
MyBatisのフレームワークのキャッシュモジュールで見てみましょうは、装飾的なパターンを使用する方法であります
まず、キャッシュインターフェースを定義し、機能をインタフェースに記載されており、主のputObjectのgetObject
パブリック インターフェースキャッシュ{ 文字列のgetId(); 空のputObject(オブジェクトキー、オブジェクト値); オブジェクトのgetObject(オブジェクトキー)。 オブジェクトREMOVEOBJECT(オブジェクトキー)。 空をクリア(); int型のgetSize(); デフォルトReadWriteLock getReadWriteLock(){ 戻り ヌル。 } }
2.次に、キャッシュの継承システムで見てみましょう
すべてJavaのクラスなので、どのような教科書のモデルはほとんど差が飾られて抽象クラスやインタフェースを、でした。。。。
3.各キャッシュキャッシュの実装クラスは、参照を所持しています
クラスのソースコードを見てLoggingCache
パブリック クラス LoggingCache 実装キャッシュ{ 民間 最終ログインログ。 民間最終キャッシュのデリゲート。 保護された int型のリクエスト= 0 ; 保護された int型のヒット= 0 ; 公共LoggingCache(キャッシュデリゲート){ this.delegate =デリゲート。 this.log = LogFactory.getLog(のgetId())。 } @Override パブリック文字列のgetId(){ 戻りdelegate.getIdを(); } @Override 公共 INT のgetSize(){ 戻りdelegate.getSize()。 } @Override 公共 ボイドのputObject(オブジェクトキー、オブジェクトのオブジェクト){ delegate.putObject(キー、オブジェクト); } @Override パブリックオブジェクトのgetObject(オブジェクトキー){ リクエスト ++ 。 最終的なオブジェクト値= delegate.getObject(キー)。 もし(!値= ヌル){ ヒット ++ ; } であれば(log.isDebugEnabled()){ log.debug( "キャッシュヒット率[" +のgetId()+ "]" + getHitRatio())。 } 戻り値。 } @Override 公衆オブジェクトREMOVEOBJECT(オブジェクトキー){ リターンdelegate.removeObject(キー)。 } @Override 公共 ボイドクリア(){ delegate.clear()。 } @Override 公共 int型のハッシュコード(){ 戻りdelegate.hashCode()。 } @Override パブリック ブール等しい(オブジェクトobj){ 戻りdelegate.equals(OBJ)。 } プライベート ダブルgetHitRatio(){ リターン(ダブル)ヒット/(ダブル)要求。 } }
キャッシュデリゲートに渡さLoggingCacheクラスのコンストラクタ、getObjectメソッドを見て
このような外観は、それは装飾的なパターンの精神的なコアと一致しているように見えますが、日常の装飾パターンをコピーしません。そして,,,それは責任と日常のチェーンのように思えます。。。。
LoggingCache#のgetObjectメソッドを呼び出すときにFifoCacheにLoggingCacheコンストラクタのパラメータを仮定し、FifoCacheパラメータコンストラクタがRedsiCacheあり、それはチェーンを形成します。
LoggingCache#のgetObject()----------> FifoCache#のgetObject()--------------------> RedisCache#のgetObject()(これは)責任まあ、もちろん、本当の責任のチェーンだけでなく、いくつかの違いがカウントされません、
この呼び出しチェーン、LoggingCache#getObject()により機能強化した後、前に行って、そしてFifoCache#のgetObject()と - 事前の機能強化した、当然のRedisCache#のgetObject()は、クエリのRedisライブラリです。
責任の+装飾チェーン:MyBatisのフレームワークは、1つのそのような操作は、具体的にどのようにこのコールチェーンの組み合わせであり、キャッシュの発信者は、関係のチェーンノードを構築する方法を見ることができない、非常に柔軟な使用して、私はそれはと同等だと思います。
このルーチンの実現には、実装クラスキャッシュキャッシュ内のすべての技術は、オブジェクトを所有しているということです。注Cacheオブジェクトではなく、キャッシュを実装して、特定のオブジェクトのこと!
おそらくこれは、それをプログラミングするためのインタフェースであります!
仕事の後、あなたは覚えて、できるだけそれを使用することができます!