デザインパターンへのAndroidアプリ

実際には、平均的なプログラマはビジネスコードを書くために、デザインパターンはあまりかかりません。比較的より重要なコードを理解し、維持しやすい書きます。

 

I.はじめに

そのデザインパターンとは何ですか?

私を含め多くの人が、誤って洞窟に落ち、新しいニッチ川や湖の萌芽のように、彼らの絶妙なをたたえ、23個のデザインパターンに巻き込まファン、デザインパターンの知人を持って、メガトロンのアセンブリをクリックしてください川や湖「武器の7種類。」......そして、シンプルなものが巨大な複合体を作っ長寿、碧玉スライスしたメロン「幸せな生活」、だけではなくて剣をチョッピング開始しました。

バックデザインモードに、であるこれらの架空の「ハート」のオブジェクト指向の原則の原則の指導の下、偉大な神「移動」や「日常」を左に、それらの高齢者のみ。しかし、移動およびルーチンが受賞されていない、それだけでその、「ハート」と絶妙の性質を理解し、理解するために反映させるために長年模倣によって、偉大な神が私たちに近いので、白であることを理解するの雑多な方法を提供します同じ動きを使用して理由を説明、常にYijizhiming、と私たちは常にニッチにして失われた偉大な神。

互いに結合し、私たちは、これらの2つの方法をダイジェストに役立つ実践的なガイドラインと実践、控除の移動およびルーチンの実用化を通じて、「モードを再構築するために、」練習していき、最終的に無ストローク勝利に、真実のすべての外観の後ろにいることを実感ストロークを持って、植生武石は剣、心ランダムウォーク、人間の心のアクションレルムとしての役割を果たすことができます。

第二に、デザインモード

Androidのソースコードは、デザインパターンの多くが含まれます。

2.1ビルダーモード

Builderのモデルでは、最も明白な兆候は、クラスを構築しており、最も一般的に使用してAndroidのダイアログが構築され、構築されたビルダーの標準モードの通知です。この場合、より適切なBuilderのため、クラスの構造は、多くのパラメータを必要とし、これらのパラメータが必要でない場合はBuilderパターンは、よりよく理解されています。

このようなボタン、OKボタン、ニュートラルボタンを、キャンセル、AlertDialog、タイトル、コンテンツを構築するよう、あなただけのいくつかのプロパティが一人でできる設定する必要があるかもしれません。

2.2シングルトン

シングルトンは、多くの場合、Androidの開発に使用されるが、表現の形は同じではないかもしれません。それは最初のシングルトンオブジェクトを生成されたクラスファイルをロードし、その後、キャッシュに格納され、キャッシュから直接使用される場合、他のシステムにActivityManagerサービスは、静的ブロックの単一の実施形態の方法によって達成されます。もちろん、のgetInstanceを使用して単一の場合は、シングルトンオブジェクトを取得することを確保するため、内部AccessibilityManager自体としてより明白な例があります。

パブリック静的{AccessibilityManagerのgetInstance(コンテキスト・コンテキスト)
    同期(sInstanceSync){ 
        IF(sInstance == NULL){ 

            ... 

            IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE)。
            IAccessibilityManagerサービス= iBinder == nullのヌル:IAccessibilityManager.Stub.asInterface(iBinder)。
            sInstance =新しいAccessibilityManager(コンテキスト、サービス、USERID)。
        } 
    } 
    sInstanceを返します。
}

  

また、このようなアプリケーションなどの一部の擬似単一のケースが、ありますが、デフォルトではそのコンストラクタがプライベートではありませんので、あなたが複数のアプリケーション例を生成することができ、そこにプロセスのインスタンスは1つだけですが、それはアプリケーションシングルトンを捉えることができません、しかし、無駄に、あなたは、関連情報添付()、なしコンテキストによって拘束されていません。

パブリックアプリケーション(){ 
    スーパー(NULL)。
}

  

1つのシーンを使用しても、非常に単純な実施形態である、唯一のAPPは、リソース消費のクラスのインスタンスまたはクラス初期化動作の存在が必要です。多くのオープンソースのフレームワークでは、我々は、このようなネットワークフレームと画像の読み込みライブラリのさまざまなオブジェクトとしての仕事を完了する必要があります。

加えて、そのような怠惰な人、空腹の人型、静的内部クラス、ダブルチェックロック、列挙などの単一のケースの多くの実装は、そう各実装および使用シナリオの主な特徴を認識するからです。

2.3プロトタイプモデル

使用されるプロトタイプモデルは開発に多くのではなく、ソースコードに反映しました。プロトタイプのモードを導入する意図は、インタフェースがCloneableをを実装することによって行われます

パブリッククラス意図はParcelable、Cloneableを実装しては{ 
    @Override 
    パブリックオブジェクトのクローン(){ 
        (この)新しいテントを返します。
    } 
}

  

実際には、このビューは、その後、あなたは何を迅速に同じ属性オブジェクトを、あなたは内部のことを、オブジェクト、プロパティを取得する意向、および意図の同じクローン上など、ここのように、プロトタイプモデルを使用することができます取得したいが、両方の組み合わせ何の関連は、それ単独で使用することはできません。

Cloneableインタフェースを実装することに加えて、あなたは、オブジェクトを取得するために、独自のメソッドを定義することができます。PhoneLayoutInflater例として紹介します。

私たちは、以下の方法により、言葉での活動にLayoutInflateを取得する場合PhoneLayoutInflaterは、LayoutInflaterサブクラスであります:

@Override 
パブリックオブジェクトgetSystemService(文字列名){ 
    IF(LAYOUT_INFLATER_SERVICE.equals(名)){ 
        IF(mInflater == NULL){ 
            mInflater = LayoutInflater.from(getBaseContext())cloneInContext(この)。
        } 
        mInflaterを返します。
    } 
    。getBaseContext()getSystemService(名前)を返します。
}

  

あなたはそれがnullの場合、それはcloneInContext()を呼び出しますが、見ることができ、この方法はPhoneLayoutInflaterで具体LayoutInflateでは抽象メソッドであり、

公共LayoutInflater cloneInContext(コンテキストnewContextを){ 
    (この、newContextを)新しいPhoneLayoutInflaterを返します。
}

  

あなたはそうすることのメリットを理解し、これはプロトタイプモデルであるので、我々はもっと重要なのは、形成するにはあまりにももつれた得ることはありません、見ることができます。

ソースに加えて、プロトタイプモデルで見ることができ、それはまた、そのような方法に従ってOkHttpClient点に存在するように、オープンソース・フレームワークに見ることができます

/ **このOkHttpClientのシャローコピーを返します。* / 
@Override 
公共OkHttpClientクローン(){ 
    新しいOkHttpClient(this)を返します。
}

  

正確に達成し、前述分かる、オブジェクトが新しいOkHttpClient構築プロセスが複雑にするので、このように直接、新しいオブジェクトを生成するように、パラメータの数、返さ低コスト、および前のオブジェクトを保持することができるされていますパラメータ設定。

2.4ファクトリメソッド

新規性のパターンビュー用のファクトリメソッドは、あなたのActivity.onCreate()メソッドが満たされた別のビューインタフェースオブジェクトを生成し、工場出荷時のモードとして見ることができます。

アンドロイドのstaticファクトリメソッドは、例がBitmapFactoryで比較的明らかである、あなたは)(decodeXXXの様々なを通じてさまざまなソースからBitmapオブジェクトを取得することができます。

2.5 Strategyパターン

戦略モードはプレイヤーに相当し、あなたがプラグ料理を駆動するもの、あなたはどのような映画を解放することができます。

戦略パターンの本質は、あなたがクラスを渡すことを、あなたは、このクラスの実現に基づいて、それを後で処理を行うことができます。アニメーションでは、例えば、補間対象の異なるセットは、あなたが異なる曲線を得ることができ、例えば、値の解像度を返すために、どのような着信パーサ、バイナリデータを文字列など、どのようなデータ形式に変換することができます。 JSON、XML。

責任パターンの2.6チェーン

例えば、非常に代表的な選択Chain of Responsibilityパターンは、それは、Androidのタッチ機構であり、このビューは、私たちはAndroidのタッチイベント配信中の別の次元から理解することができます。

2.7 Observerパターン

オブザーバモデルにおけるAndroidのは、モデルのように、単語の使用シナリオのこのパターンのために非常に頻繁に使用する必要があります:あなたはすぐに通知オブジェクトの変更をしたいとき。

私はアダプタモードに属し、学ぶ、ここでオブザーバーパターンの姿を知らないアダプタを知っていた前に、一例として、リストビューのアダプタを使用してObserverパターン。

などのタッチ、タップ、ボタン、などオブザーバーパターンに属し、また、リスナーの様々な内部でAndroidの、のContentProviderおよびラジオ受信機はまた、オブザーバーモードを把握、どこにでもあると言うことができます。

また、多くのサードパーティオブザーバーパターンベースのフレームワークは、などEventBus、RxJavaとして、非常に大きく、我々は深く、使用のオブザーバーモードです。

2.8 Template Methodパターン

私は、このモードより少ない接触を持っていましたが、ご理解のうえ、あなたは、このモデルは非常に単純であるでしょう。テンプレートパターンワードシナリオを使用する方法は、次のとおり処理は、サブクラスによって完成特定の実装の詳細が決定されます。

ここでは、「プロセス」のキーワードを見なければならない、単に抽象クラスを取り、必要条件「サブクラスによって完成し、特定の実装の詳細」に沿ったものであり、プロセスに流れ、テンプレートメソッドパターンと呼ばれるがあるかどうか、ないプロセスの重要嘘、それは抽象クラスを実装することです。

このモードは、プロセスに沿って、様々な方法、私たちによって行わ具体的な実現、非常に古典的との間で行わAsyncTask、使用されています。

内部アンドロイドテンプレートメソッドパターンに加えて、他のオープンソースプロジェクトでは、このモデルを使用してもあります。

2.9プロキシモードとデコレーター

一緒に、なぜこれらの二つの理由は、それらの違いについて簡単にので、ここでは、これらのような二つのモデル、二つの主要な点の、と述べました。

動的オブジェクトへのアクセスを制御することに集中するオブジェクトのメソッド、およびプロキシモードを追加するデコレータ注意

プロキシモードでは、エージェントクラスは、その顧客固有の情報にオブジェクトを非表示にすることができます。代理店モデルを使用した場合そのため、私たちはしばしば、プロキシクラスのオブジェクトのインスタンスを作成します。我々はDecoratorパターンを使用した場合と、通常の練習は、コンストラクタデコレータにパラメータとして元のオブジェクトにあります

これらの二つの文を理解することは容易でないかもしれない、次の例を見て、問題ではありません。

プロキシモードでは、プロキシオブジェクトのインスタンスを保持し、このインスタンスは、一般に、プロキシクラスない追加の割り当てに直接存在するメンバ変数として使用されます。

例えばWindowManagerImplは、名前のように見えるものの、プロキシクラスであるが、それはWindowManagerGlobalプロキシオブジェクトです。次のコードから見ることができます。

パブリック最終クラスWindowManagerImplは、ウィンドウマネージャ{実装
    プライベート最終WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstanceを(); 
    民間最終的な表示mDisplay。
    民間最終ウィンドウmParentWindow。

    ...... 

    @Override 
    公共ボイドaddView(ビュービュー、ViewGroup.LayoutParamsのparamsは){ 
        mGlobal.addView(ビュー、paramsは、mDisplay、mParentWindow)。
    } 

    @Override 
    公共ボイドupdateViewLayout(ビュービュー、ViewGroup.LayoutParamsのparamsは){ 
        mGlobal.updateViewLayout(ビュー、paramsは)。
    } 

    @Override 
    公共ボイドremoveView(ビュービュー){ 
        mGlobal.removeView(偽図)。
    }

    @Override 
    公共ボイドremoveViewImmediate(ビュービュー){ 
        mGlobal.removeView(ビュー、真の); 
    } 

    @Override 
    パブリックディスプレイgetDefaultDisplay(){ 
        mDisplayを返します。
    } 
}

  

上記のコード、WindowManagerGlobalによって達成されるWindowManagerImplほとんどの方法は、追加のオブジェクトとWindowManagerGlobal割り当てから分かるように、WindowManagerImplで存在します。また、方法WindowManagerGlobalの事実たっぷりありますが、プロキシによってWindowManagerImplた後、透明であり、開発者に公開されていません。

私たちは、Decoratorパターンを見てみましょう。装飾オブジェクト制御モードは、アクセスではなく、基底クラスに比べて拡張は、拡張、より柔軟なDecoratorパターンを継承します。

本コンテキストとパッケージContextWrapper説明に基づいて、だけでなく、非常に一般的ですが、Decoratorパターンの形を説明するためにいくつかのコードを掲載しました。

パブリッククラスContextWrapperはコンテキスト{延び
    コンテキストmBaseと、

    公共ContextWrapper(コンテキストベース){ 
        mBase =塩基; 
    } 
}

  

しかし、問題はContextWrapper、すべてのメソッドの実現は、それの良い拡張を言って、正式に数の上、mBaseによって達成されている、つまり、あるのでしょうか?

拡張子は内部の事実ContextWrapperサブクラスContextThemeWrapperです。

内部ContextWrapperでは、システムサービスへのアクセスはmBaseを通じて直接実行されます

@Override 
パブリックオブジェクトgetSystemService(文字列名){ 
    mBase.getSystemService(名前)を返します。
}

  

しかしContextThemeWrapperの内部には、この方法では、機能拡張を完了するために書き直されました

@Override 
パブリックオブジェクトgetSystemService(文字列名){ 
    IF(LAYOUT_INFLATER_SERVICE.equals(名)){ 
        IF(mInflater == NULL){ 
            mInflater = LayoutInflater.from(getBaseContext())cloneInContext(この)。
        } 
        mInflaterを返します。
    } 
    。getBaseContext()getSystemService(名前)を返します。
}

  

もちろん、何の拡張子がない場合は、まだDecoratorパターンではないでしょうか?実際には、デザインモードでは、常にもの「見る人の目は、賢明な知恵を参照してください」となって。

第三に、要約

実際には、Androidのデザインパターンは、どこでもないデザインパターンの不足、それに配慮の欠如を存在します。もちろん、提案された設計パターンは、我々は同様の問題が発生したとき、あなたが考え、デザインパターンの観点から問題を解決することができ、特定の問題を解決します。

デザインパターンは、それが実際には良くも悪くもない、中立的である、万能薬ではありません。

私について

詳細については、あなたがクリックすることができます私に  、そして非常にみんなと共有したい、と一般的な進捗状況

おすすめ

転載: www.cnblogs.com/1157760522ch/p/11593314.html