你架構(gòu)中使用了什么設(shè)計(jì)模式摊灭?

總是被面試官問(wèn)道你在項(xiàng)目中用到了什么設(shè)計(jì)模式,之前是在自己寫的ImageLoader中對(duì)緩存用了設(shè)計(jì)模式偷崩,但是由于種種原因還是最后選擇了Picasso圖片緩存框架砖第。有的時(shí)候就不怎么好回答面試官的問(wèn)題。特記錄此篇文章進(jìn)行總結(jié)环凿。


設(shè)計(jì)原則:

參考 軟件設(shè)計(jì)總覽

  1. 單一職責(zé)原則:一個(gè)類應(yīng)該有且僅有一個(gè)職責(zé)
  2. 開閉原則: 對(duì)于一個(gè)已有的軟件,如果需要擴(kuò)展放吩,應(yīng)當(dāng)在不需修改已有代碼的基礎(chǔ)上進(jìn)行智听。
    實(shí)現(xiàn)方法:抽象,把抽象接口與實(shí)現(xiàn)分離渡紫。
  3. 依賴倒置原則:盡量依賴于抽象到推,而不是依賴于實(shí)現(xiàn)
  4. 接口隔離原則: 客戶端不應(yīng)該依賴它不需要的接口;一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小的接口上惕澎。
  5. 迪米特原則:最少知識(shí)原則
//將圖片保存在本地
public void put(String url, Bitmap bmp) {
 OutputStream fileOutputStream = null;
 try {
     fileOutputStream = new FileOutputStream(cacheDir + url);
     bmp.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
 } catch (FileNotFoundException e) {
     e.printStackTrace();
 } finally {
     CloseUtils.closeQuietly(fileOutputStream);
 }
}
public final class CloseUtils {
 public static void closeQuietly(Closeable closeable) {
     if (null != closeable) {
         try {
             closeable.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 }
}

1.MVP

Rxjava+MVP

2.策略模式的應(yīng)用


我們集成支付通常都有支付寶莉测、微信、和自己App錢包支付唧喉,到底怎么設(shè)計(jì)符合設(shè)計(jì)模式呢捣卤,請(qǐng)看?(還可以在PayHelper中設(shè)置paySuccess和payFailure的監(jiān)聽忍抽,簡(jiǎn)單起見未在示例中處理)
1. 抽象類

public abstract class Pay {
    protected String sdkInfo;
    protected String tradeId;
    /**
     * sdkInfo:調(diào)用sdk的信息
     * tradeId:交易號(hào)
     */
    public Pay(String sdkInfo,String tradeId){
        this.sdkInfo = sdkInfo;
        this.tradeId = tradeId;
    }

    public abstract void startPay(Activity activity);
}

2. Pay的具體實(shí)現(xiàn)

public class AliPay extends Pay {
    /**
     * sdkInfo:調(diào)用sdk的信息
     * tradeId:交易號(hào)
     *
     * @param sdkInfo
     * @param tradeId
     */
    public AliPay(String sdkInfo, String tradeId) {
        super(sdkInfo, tradeId);
    }

    @Override
    public void startPay(final Activity activity) {
        Thread payThread = new Thread(new Runnable() {

            @Override
            public void run() {
                // 構(gòu)造PayTask 對(duì)象
                PayTask alipay = new PayTask(activity);
                // 調(diào)用支付接口,獲取支付結(jié)果
                String result = alipay.pay(sdkInfo);

                //...
            }
        });
        payThread.start();
    }

}
public class WxPay extends Pay {
    /**
     * sdkInfo:調(diào)用sdk的信息
     * tradeId:交易號(hào)
     *
     * @param sdkInfo
     * @param tradeId
     */
    public WxPay(String sdkInfo, String tradeId) {
        super(sdkInfo, tradeId);
    }

    @Override
    public void startPay(Activity activity) {
        final String[] split = sdkInfo.split("_");

        PayReq req = new PayReq();
        req.appId = split[0];
        req.partnerId = split[1];
        req.prepayId = split[2];
        req.nonceStr = split[3];
        req.timeStamp = split[4];
        req.packageValue = split[4];
        req.sign = split[6];

        IWXAPI wxPayApi = WXAPIFactory.createWXAPI(activity, WxConfig.APP_ID);
        wxPayApi.sendReq(req);
    }
}
public class WalletPay extends Pay {
    /**
     * sdkInfo:調(diào)用sdk的信息
     * tradeId:交易號(hào)
     *
     * @param sdkInfo
     * @param tradeId
     */
    public WalletPay(String sdkInfo, String tradeId) {
        super(sdkInfo, tradeId);
    }

    @Override
    public void startPay(Activity activity) {
        //調(diào)用本地的sdk
    }
}

3. Context-PayHelper

public class PayHelper {
    private Pay pay;
    private PayResult result;

    public PayHelper(Pay pay) {
        this.pay = pay;
    }

    public void startPay(Activity activity) {
        if (!(activity instanceof PayResult)){
            throw new IllegalStateException("Activity should implents PayResult");
        }
        result = (PayResult) activity;
        pay.startPay(activity);
    }

    interface PayResult {
        void paySuccess();

        void payFailure();
    }
}

4. 客戶端調(diào)用

public class Client extends Activity implements PayHelper.PayResult{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //支付寶支付
        new PayHelper(new AliPay("","")).startPay(this);
        //微信支付
        new PayHelper(new WxPay("","")).startPay(this);
        //錢包支付
        new PayHelper(new WalletPay("","")).startPay(this);
    }

    @Override
    public void paySuccess() {
        
    }

    @Override
    public void payFailure() {

    }
}

未完待續(xù)董朝,持續(xù)更新中鸠项!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市子姜,隨后出現(xiàn)的幾起案子祟绊,更是在濱河造成了極大的恐慌,老刑警劉巖哥捕,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牧抽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡遥赚,警方通過(guò)查閱死者的電腦和手機(jī)扬舒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鸽捻,“玉大人呼巴,你說(shuō)我怎么就攤上這事∮眩” “怎么了衣赶?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)厚满。 經(jīng)常有香客問(wèn)我府瞄,道長(zhǎng),這世上最難降的妖魔是什么碘箍? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任遵馆,我火速辦了婚禮,結(jié)果婚禮上丰榴,老公的妹妹穿的比我還像新娘货邓。我一直安慰自己,他們只是感情好四濒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布换况。 她就那樣靜靜地躺著,像睡著了一般盗蟆。 火紅的嫁衣襯著肌膚如雪戈二。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天喳资,我揣著相機(jī)與錄音觉吭,去河邊找鬼。 笑死仆邓,一個(gè)胖子當(dāng)著我的面吹牛鲜滩,可吹牛的內(nèi)容都是我干的伴鳖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼绒北,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼黎侈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起闷游,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤峻汉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后脐往,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讼撒,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漆弄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年恩溅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了批狱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梅尤,死狀恐怖柜思,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巷燥,我是刑警寧澤赡盘,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站缰揪,受9級(jí)特大地震影響陨享,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钝腺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一抛姑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艳狐,春花似錦定硝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蒜茴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浆西,已是汗流浹背粉私。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留近零,地道東北人诺核。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓抄肖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親窖杀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漓摩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法入客,內(nèi)部類的語(yǔ)法管毙,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法桌硫,線程的語(yǔ)...
    子非魚_t_閱讀 31,657評(píng)論 18 399
  • 設(shè)計(jì)模式六大原則 設(shè)計(jì)模式六大原則(1):?jiǎn)我宦氊?zé)原則 定義:不要存在多于一個(gè)導(dǎo)致類變更的原因夭咬。通俗的說(shuō),即一個(gè)類...
    viva158閱讀 770評(píng)論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理铆隘,服務(wù)發(fā)現(xiàn)卓舵,斷路器,智...
    卡卡羅2017閱讀 134,693評(píng)論 18 139
  • 在工作初期,我們可能會(huì)有這樣的感覺(jué)肿嘲,自己的代碼接口設(shè)計(jì)混亂融击、代碼耦合較為嚴(yán)重、一個(gè)類的代碼過(guò)多等睦刃,當(dāng)自己回過(guò)頭再看...
    Gh0stClub閱讀 608評(píng)論 0 2
  • 【開心啟蒙】2017.9.21 學(xué)習(xí)力六期踐行記錄D120 1.兒歌視頻十分鐘砚嘴。 2.指讀小熊寶寶繪本,寶寶講一本...
    璐璐同學(xué)閱讀 197評(píng)論 0 0