Android デザインパターンの 6 つの基本原則

単一責任の原則SRP

クラスに関して、それが変化する原因は 1 つだけです

オープン・クローズド原則OCP

変更は既存のコードを変更するのではなく、拡張機能によって実装されます。継承などによって新しい実装を追加しないようにしてください。

リスコフ置換原理LSP

親クラスが出現できる限り、主に実装と継承においてサブクラスが出現できます。

依存関係反転の原理DIP

高レベルのモジュールが低レベルのモジュールに依存せず、高レベルのモジュールが詳細ではなく抽象化に依存する、特定の形式の切り離し

インターフェース分離原則ISP

クライアントが依存するインターフェイスをできるだけ少なくします。インターフェイス分割、単一インターフェイス

デメテル原則自民党

最も知られていない原則、オブジェクトは他のオブジェクトについての知識が最も少ない

実用化

ネットワーク リクエスト フレームワークを設計します。その機能には、ネットワーク リクエスト、キャッシュ、戻りデータ分析などが含まれます。

1. 最初の段階:

        すべての関数はアクティビティに記述されます

  問題点:設計が全くできていない 複数箇所で呼び出すと重複コードが多すぎる 修正すると全ての箇所の2段目を修正する必要がある

2. 第 2 段階:

        リクエストをツール クラス HttpUtils にカプセル化します。

  問題: HttpUtils クラスが肥大化しすぎて、実行することが多すぎます。リクエスト、キャッシュなどはすべてこのクラス内で結合されており、返されたデータの分析処理は外部の呼び出し元などによってのみ処理できます。

3. 第 3 段階:

  1. キャッシュ関数を SpHttpCache に抽出します (現在、キャッシュは sp にのみキャッシュされます) (単一責任原則)
  2. HttpCallBackインターフェイスを作成し、リクエストの成功または失敗のコールバックを直接操作し、データ分析や異なる形式で返されたデータの互換性など、返された結果のパブリックイベントの処理をHttpUtilsリクエストに組み込みます。

  問題:いくつかの共通ロジックをツール クラスにカプセル化するだけで、スケーラビリティがまったくなく、リクエスト コードがすべて 1 つの山に詰め込まれ、呼び出しパラメータが多すぎて、十数個のパラメータをツール クラスに渡す必要がある場合があります。リクエストメソッドやリクエストパラメータなどの構築方法、タイムアウト再接続、タイムアウト期間、Cookieをサポートするかどうかなど。パラメータを拡張する必要がある場合は、さらにコンストラクタを追加する必要があります

4. 第 4 段階:   

  1. HttpUtils で、呼び出しをチェーンするようにパラメーターを変更し、呼び出し元が必要とするパラメーターを呼び出し、必要ない場合は呼び出さないようにします。
  2.     public static HttpUtils with(Context context){
            return new HttpUtils(context);
        }
    
        private HttpUtils(Context context) {
            mHttpRequest = new OKHttpRequest();
            mParams = new HashMap<>();
            this.mContext = context;
        }
    
        public HttpUtils get(){
            mType = TYPE_GET;
            return this;
        }
    
        public HttpUtils param(String key,Object value){
            mParams.put(key,value);
            return this;
        }
    
        public HttpUtils url(String url){
            this.mUrl = url;
            return this;
        }
    
        public <T> void request(final HttpCallBack<T> callback){
            // 在此做一些异常判断,如url校验等
            mHttpRequest.get(mContext,mUrl,mParams,callback,true);
        }
  3. リクエスト前にパラメータの検証を行う
  4. リクエストを OKHttpRequest クラスにカプセル化します (単一責任原則)

  質問:他のネットワーク リクエストを使用したい場合は、 HttpUtils の呼び出しのみを変更するか、いつでもネットワーク リクエストを切り替えることができます。どのように対処すればよいですか?

5. 第 5 段階:   

  1. IHttpRequest インターフェイスを作成し、インターフェイス内で get や post などのメソッドを定義します。
  2. OKHttpRequest リクエスト クラスは、IHttpRequest インターフェイス インターフェイスを実装します。
  3. HttpUtils に IHttpRequest パラメーターを追加すると、呼び出し元はチェーン呼び出しを通じて IHttpRequest インターフェイスを実装するサブクラスを渡すことができます。
    private IHttpRequest mHttpRequest;
    ……
    public HttpUtils httpRequest(IHttpRequest httpRequest){
        mHttpRequest = httpRequest;
        return this;
    }

    // 可在application设置默认请求
    public static void initHttpRequest(IHttpRequest httpRequest) {
        mInitHttpRequest = httpRequest;
    }


    public <T> void request(final HttpCallBack<T> callback){
        if(mHttpRequest == null){
            mHttpRequest = mInitHttpRequest;
        }
        // 异常判断
        mHttpRequest.get(mContext,mUrl,mParams,callback,true);
    }

    4. 新しいネットワーク リクエストを追加する場合は、IHttpRequest を実装するクラスを作成し、httpRequest() メソッドを呼び出して、呼び出し時に必要なネットワーク リクエストを設定するだけです。

        開始と終了の原則:新しいネットワーク リクエストを追加する必要がある場合、HttpUtils のコードを変更する必要はありません。追加する必要があるのは新しいクラスだけです。拡張にはオープンで、変更にはクローズされます。

         Liskov 置換原則:親クラス IHttpRequest が出現する場合、サブクラス OKHttpRequest が出現する可能性があります。HttpUtils.initHttpRequest(new OKHttpRequest());

         依存関係逆転の原則:高レベルの HttpUtil は、低レベルの詳細 (OKHttpRequest) には依存せず、低レベルの抽象化 (IHttpRequest) に依存します。

        ディミッターの原則: MainActivity では、HttpUtils を使用してネットワーク リクエストを作成します。その実装方法は関係ありません。必要なパラメータを渡すだけで、最終結果を取得することができます。残りは気にしないでください。

     5. キャッシュクラス、メモリキャッシュ、ディスクキャッシュ(データベース、ハードディスク)についても同様です。

        頻繁に使用されるインターフェイスはメモリとディスクにキャッシュでき、使用頻度の低いインターフェイスはディスクに直接キャッシュできます。

おすすめ

転載: blog.csdn.net/weixin_42277946/article/details/131031429