面向?qū)ο罅蠡驹瓌t(一)

單一職責(zé)原則

單一職責(zé)原則的英文名稱是Single Responsibility Principle裸准,簡稱SRP。它的定義是:就一個類而言赔硫,應(yīng)該僅有一個引起它變化的原因炒俱。簡單來說,一個類中應(yīng)該是一組相關(guān)性很高的函數(shù)爪膊、數(shù)據(jù)的封裝权悟。
比如網(wǎng)絡(luò)請求,在初始封裝時

 /**
 * get 請求數(shù)據(jù)列表
 * @param context 上下文
 * @param url 訪問路徑
 * @param params 訪問參數(shù)
 */
public static <T> void get(Context context, String url, Map<String, Object> params,  final      HttpCallBack<T> callback) {
     OkHttpClient mOkHttpClient = new OkHttpClient();
    // 公共參數(shù)拼接
     params.put("token", "xxxxxxx");
     params.put("taype", "android");
    //可以省略推盛,默認(rèn)是GET請求
    Request request = requestBuilder.build();
    // 異步請求數(shù)據(jù)
    mOkHttpClient.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, final IOException e) {
            // 失敗
            callback.onFailure(e);
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            final String resultJson = response.body().string();
            // json 轉(zhuǎn)換峦阁,有無數(shù)據(jù)列表,緩存處理
           }
        });
   }

使用單一職責(zé)原則拆分


Paste_Image.png
 public class HttpUtils {
private OKHttpRequest mHttpRequest;

private HttpUtils(Context context) {
    mHttpRequest = new OKHttpRequest();
    mHttpRequest.with(context);
}
 // 省略一些代碼 ...
 }

開閉原則

開閉原則的英文全稱是Open Close Principle耘成,簡稱OCP榔昔,它是Java世界里最基礎(chǔ)的設(shè)計原則驹闰,它指導(dǎo)我們?nèi)绾谓⒁粋€穩(wěn)定的、靈活的系統(tǒng)撒会。開閉原則的定義是:軟件中的對象(類疮方、模塊、函數(shù)等)應(yīng)該對于擴展是開放的茧彤,但是,對于修改是封閉的疆栏。我的理解是對于原來寫好的代碼里面是不可修改曾掂,但是對于外部又是可擴展的。


Paste_Image.png
    public class HttpUtils {
// 這個可以在 application 中去初始化
private static IHttpRequest mInitHttpRequest;
private IHttpRequest mHttpRequest;
public static void initHttpRequest(IHttpRequest httpRequest) {
    mInitHttpRequest = httpRequest;
}
// 如果有兩種的情況下 比如 volley 下載文件并不是很屌 壁顶,那么可以換成 OKHttp 
public HttpUtils httpRequest(IHttpRequest httpRequest) {
    this.mHttpRequest = httpRequest;
    return this;
}
// 省略部分代碼 ......
public <T> void execute(HttpCallBack<T> callback) {
    // 如果沒有指定珠洗,那么就用 application 中初始化的
    if(mHttpRequest == null){
        mHttpRequest = mInitHttpRequest;
    }
    mHttpRequest.get(mContext, mParams, mUrl, mCache, callback);
}
}

IHttpRequest 代碼

public interface IHttpRequest {
/**
 * post 提交
 *
 * @param context
 * @param params
 * @param url
 * @param cache
 * @param callback
 * @param <T>
 */
<T> void post(Context context, Map<String, Object> params, String url, final boolean cache, final HttpCallBack<T> callback);

/**
 * get 提交
 *
 * @param context
 * @param params
 * @param url
 * @param cache
 * @param callback
 * @param <T>
 */
<T> void get(Context context, Map<String, Object> params, String url, final boolean cache, final HttpCallBack<T> callback);

}
OKHttpRequest 代碼

public class OKHttpRequest implements IHttpRequest {
private HttpCache mHttpCache;
private OkHttpClient mOkHttpClient;

public OKHttpRequest() {
    mHttpCache = new HttpCache();
    mOkHttpClient = new OkHttpClient();
}

@Override
public <T> void post(Context context, Map<String, Object> params, String url, boolean cache, HttpCallBack<T> callback) {
    // 省略部分代碼 ......
}

public <T> void get(Context context, Map<String, Object> params, String url, final boolean cache, final HttpCallBack<T> callback) {
   // 省略部分代碼 ......
}

}
XUtilsRequest 代碼

  public class XUtilsRequest implements IHttpRequest {
  private HttpCache mHttpCache;

 public XUtilsRequest() {
    mHttpCache = new HttpCache();
 }

@Override
public <T> void post(Context context, Map<String, Object> params, String url, boolean cache, HttpCallBack<T> callback) {
    // 省略部分代碼 ......
}

public <T> void get(Context context, Map<String, Object> params, String url, final boolean cache, final HttpCallBack<T>       callback) {
    // 省略部分代碼 ...... 
}
}

Application 代碼

public class BaseApplication extends Application {
@Override
public void onCreate() {
    super.onCreate();
    PreferencesUtil.getInstance().init(this);
    x.Ext.init(this);
    // 初始化指定網(wǎng)絡(luò)請求  
    HttpUtils.initHttpRequest(new XUtilsRequest());
}
}

里氏替換原則

里氏替換原則英文全稱是Liskov Substitution Principle,簡稱LSP若专。我們知道许蓖,面向?qū)ο蟮恼Z言的三大特點是繼承、封裝调衰、多態(tài)膊爪,里氏替換原則就是依賴于繼承、多態(tài)這兩大特性嚎莉。里氏替換原則簡單來說就是米酬,所有引用基類的地方必須能透明地使用其子類的對象。通俗點講趋箩,只要父類能出現(xiàn)的地方子類就可以出現(xiàn)赃额。但是,反過來就不行了叫确,有子類出現(xiàn)的地方跳芳,父類未必就能適應(yīng)。

 // 1. 今天所寫的初始化請求
 HttpUtils.initHttpRequest(new XUtilsRequest());
 HttpUtils.initHttpRequest(new OKHttpRequest());
// 2. RecyclerView 的 LayoutMananger
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setLayoutManager(new GridLayoutManager(this,3));

使用的地方非常之多竹勉,setLayoutManager 的源碼大家可以自己去了解一下飞盆,上面的代碼就很好的反應(yīng)了里氏替換原則,XUtilsRequest饶米、OKHttpRequest 都可以替換 IHttpRequest 的工作桨啃。IHttpRequest 建立了 post 請求,get 請求檬输,上傳照瘾,下載的接口規(guī)范,XUtilsRequest 等根據(jù)接口規(guī)范實現(xiàn)了相應(yīng)的功能丧慈,用戶只需要在 Application 中指定具體的緩存對象就可以動態(tài)地替換 IHttpRequest 中的請求析命。這就使得網(wǎng)絡(luò)請求具有了無線的可能性主卫,也就是保證了可擴展性。

里氏替換原則和開閉原則有點相似鹃愤,但仔細(xì)理解他們之間是不同的概念簇搅,只能夠說是有時候開閉原則和里氏替換原則往往生死相依、不棄不離软吐,通過里氏替換來達(dá)到對擴展開放瘩将,對修改關(guān)閉的效果,這兩個原則其實就是面向?qū)ο笏枷胫械某橄蟆?/p>

依賴倒置原則

依賴倒置原則英文全稱是Dependence Inversion Principle凹耙,簡稱DIP姿现。依賴反轉(zhuǎn)原則指代了一種特定的解耦形式,高層模塊不依賴低層次模塊的細(xì)節(jié)肖抱,說白了高層次就是不依賴細(xì)節(jié)而是依賴抽象备典。那什么又是低層次什么是高層次?拿上面開閉原則那張圖來講意述,HttpUtils 是高層次提佣,IHttpRequest、XUtilsRequest 和 OKHttpRequest 是低層次荤崇。剛開始 HttpUtils 是這么寫的:

 public class HttpUtils {
  private OKHttpRequest mHttpRequest;

  private HttpUtils(Context context) {
    mHttpRequest = new OKHttpRequest();
    mHttpRequest.with(context);
 }

 // 省略一些代碼 ...
 }

這個時候我們依賴的是具體的 OKHttpRequest拌屏,這種情況下很明顯我們依賴的是具體的細(xì)節(jié), 在開閉原則過后术荤,我們 HttpUtils 是這么寫的槐壳。

     public class HttpUtils {
    // 這個可以在 application 中去初始化
   private static IHttpRequest mInitHttpRequest;
   private IHttpRequest mHttpRequest;
  public static void initHttpRequest(IHttpRequest httpRequest) {
    mInitHttpRequest = httpRequest;
}
// 如果有兩種的情況下 比如 volley 下載文件并不是很屌 ,那么可以換成 OKHttp 
public HttpUtils httpRequest(IHttpRequest httpRequest) {
    this.mHttpRequest = httpRequest;
    return this;
}
// 省略部分代碼 ......
public <T> void execute(HttpCallBack<T> callback) {
    // 如果沒有指定喜每,那么就用 application 中初始化的
    if(mHttpRequest == null){
        mHttpRequest = mInitHttpRequest;
    }
    mHttpRequest.get(mContext, mParams, mUrl, mCache, callback);
}
 }

這個時候我們依賴的就已經(jīng)不在是具體的細(xì)節(jié)了务唐,而是抽象的 IHttpRequest ,具體的實現(xiàn)我們是在 Application 中配置的带兜,可以配置 Okhttp 或者 xUtils 等等枫笛。從上面這幾個來看要讓整個系統(tǒng)更加靈活,似乎一直都是抽象的功勞刚照。

接口隔離原則

接口隔離原則英文全稱是InterfaceSegregation Principles刑巧,簡稱ISP。它的定義是:客戶端不應(yīng)該依賴它不需要的接口无畔。另一種定義是:類間的依賴關(guān)系應(yīng)該建立在最小的接口上啊楚。接口隔離原則將非常龐大、臃腫的接口拆分成為更小的和更具體的接口浑彰,這樣客戶將會只需要知道他們感興趣的方法恭理。接口隔離原則的目的是系統(tǒng)解開耦合,從而容易重構(gòu)郭变、更改和重新部署颜价,讓客戶端依賴的接口盡可能地小涯保。

最少知識原則

最少知識原則又稱為迪米特原則英文全稱為Law of Demeter,簡稱LOD周伦,雖然名字不同夕春,但描述的是同一個原則:一個對象應(yīng)該對其他對象有最少的了解。通俗地講专挪,一個類應(yīng)該對自己需要耦合或調(diào)用的類知道得最少及志,類的內(nèi)部如何實現(xiàn)、如何復(fù)雜都與調(diào)用者或者依賴者沒關(guān)系寨腔,調(diào)用者或者依賴者只需要知道他需要的方法即可困肩,其他的我一概不關(guān)心。類與類之間的關(guān)系越密切脆侮,耦合度越大,當(dāng)一個類發(fā)生改變時勇劣,對另一個類的影響也越大靖避。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市比默,隨后出現(xiàn)的幾起案子幻捏,更是在濱河造成了極大的恐慌,老刑警劉巖命咐,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篡九,死亡現(xiàn)場離奇詭異,居然都是意外死亡醋奠,警方通過查閱死者的電腦和手機榛臼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門拼窥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莹痢,“玉大人春哨,你說我怎么就攤上這事熟呛≈枋樱” “怎么了办绝?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵辜王,是天一觀的道長级乐。 經(jīng)常有香客問我议薪,道長尤蛮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任斯议,我火速辦了婚禮产捞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哼御。我一直安慰自己轧葛,他們只是感情好搂抒,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尿扯,像睡著了一般求晶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衷笋,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天芳杏,我揣著相機與錄音,去河邊找鬼辟宗。 笑死爵赵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泊脐。 我是一名探鬼主播空幻,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼容客!你這毒婦竟也來了秕铛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤缩挑,失蹤者是張志新(化名)和其女友劉穎但两,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體供置,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡谨湘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了芥丧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片紧阔。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖续担,靈堂內(nèi)的尸體忽然破棺而出寓辱,到底是詐尸還是另有隱情,我是刑警寧澤赤拒,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布秫筏,位于F島的核電站,受9級特大地震影響挎挖,放射性物質(zhì)發(fā)生泄漏这敬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一蕉朵、第九天 我趴在偏房一處隱蔽的房頂上張望崔涂。 院中可真熱鬧,春花似錦始衅、人聲如沸冷蚂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝙茶。三九已至艺骂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隆夯,已是汗流浹背钳恕。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蹄衷,地道東北人忧额。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像愧口,于是被迫代替她去往敵國和親睦番。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容