Android 設(shè)計(jì)模式的6大原則

此代碼為 Android 設(shè)計(jì)模式學(xué)習(xí)

涉及到的設(shè)計(jì)原則有

1 單一職責(zé)原則 比如代碼中的緩存和圖片加載功能就是分開(kāi)的


圖片.png

2 開(kāi)閉原則
ocp通過(guò)對(duì)IImageCache接口的實(shí)現(xiàn) 以后的緩存修改都去實(shí)現(xiàn)這個(gè)接口
保證了在不改變當(dāng)前代碼的情況下添加新的功能

接口

public interface IImageCache {
    Bitmap get(String url);
    void put(String url,Bitmap bitmap);
}

實(shí)現(xiàn)類

public class ImageCacheSD implements IImageCache {

    public static final String cacheDir = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "temp" + File.separator; //路徑名

    public ImageCacheSD() {
    }


    @Override
    public Bitmap get(String url) {
        return BitmapFactory.decodeFile(cacheDir + "/text0.jpg");
    }

    @Override
    public void put(String url, Bitmap bitmap) {
        Log.e("text123", "put: ");
        FileOutputStream fileOutputStream = null;
        try {
            File file = new File(cacheDir);
            if(!file.exists()) {
                file.mkdirs();//新建目錄
            }
            String newPath = "text0" + ".jpg"; //文件名
            File files = new File(file,newPath);
            fileOutputStream = new FileOutputStream(files);
            boolean compress = bitmap.compress(Bitmap.CompressFormat.PNG, 80, fileOutputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            Log.e("text123", "put: e = " + e.toString());
        } finally {
            CloseUtils.CloseStream(fileOutputStream);
        }
    }
}
public class ImageCache implements IImageCache {
    LruCache<String, Bitmap> mImageLruCache;

    public ImageCache() {
        initImageLoader();
    }

    private void initImageLoader() {
        int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
        int cacheSize = maxMemory / 4;
        mImageLruCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return super.sizeOf(key, value);
            }
        };
    }

    @Override
    public void put(String url, Bitmap bitmap) {
        mImageLruCache.put(url, bitmap);
    }

    @Override
    public Bitmap get(String url) {
        return mImageLruCache.get(url);
    }
}

3 里氏替換原則 lsp
一個(gè)軟件實(shí)體如果使用的是一個(gè)父類的話,那么一定適用于其子類嫂伞,而且它察覺(jué)不出父類對(duì)象和子類對(duì)象的 區(qū)別孔厉。即拯钻,子類型必須能夠替換掉它們的父類型。
子類擁有父類所有非Private的行為和屬性撰豺。
個(gè)人理解 就是子類繼承父類(可以是具體的實(shí)體類 或者抽象類) 然后在使用的時(shí)候運(yùn)用多態(tài)原理 調(diào)用的是父類的方法但是實(shí)現(xiàn)的是子類

4 依賴倒置
DIP 和LSP相比這個(gè)父類就是一個(gè)抽象接口 在使用的時(shí)候細(xì)節(jié)隱藏在這個(gè)接口的實(shí)現(xiàn)類里面 在使用的時(shí)候調(diào) 用的是接口的函數(shù)

共同點(diǎn) 都是用的是多態(tài)的原理隱藏具體的細(xì)節(jié)然子類自己實(shí)現(xiàn)自己的業(yè)務(wù)內(nèi)容 在調(diào)用的時(shí)候只是調(diào)用上級(jí)類的函數(shù)從而得到結(jié)果

區(qū)別 LSP的關(guān)鍵在于繼承(extends) 而SIP的關(guān)鍵在于實(shí)現(xiàn)(implements) LSP其實(shí)就是進(jìn)一步封裝的SIP 所以ISP相對(duì)于LSP更靈活一點(diǎn)

比如在實(shí)現(xiàn)圖片加載的時(shí)候 可以用 ImageCacheDouble 也可以用 ImageCacheSD
他們都是實(shí)現(xiàn)了IImageCache接口 所以是依賴倒置
但是如果是 ImageCacheDouble extends IImageCache 什么的就是里氏替換了
說(shuō)白了其實(shí)都是把細(xì)節(jié)隱藏還不影響擴(kuò)展性

//        ImageLoader loader = new ImageLoader(new ImageCacheDouble());
        ImageLoader loader = new ImageLoader(new ImageCacheSD());
        String str = "https://static.firefoxchina.cn/img/201904/8_5cc650135d39b0.jpg";
        loader.displayImage(str,mMainIv);

5 接口隔離原則
類間的依賴關(guān)系應(yīng)該建立在最小的接口上,接口隔離原則就是吧非常龐大的,
臃腫的接口拆分成更小的和更具體的接口 他的目標(biāo)是系統(tǒng)解耦從而容易重構(gòu)更改和重新部署
代碼中的CloseUtils這個(gè)類就是這樣的一個(gè)實(shí)現(xiàn)
其實(shí)我的理解就是用一個(gè)接口和一個(gè)實(shí)現(xiàn)類把一部分或者是一個(gè)功能獨(dú)立出出來(lái) 使用代價(jià)就是會(huì)多些一些代碼和接口
建議用在容易修改的地方或者重復(fù)多的函數(shù)中

/**
 * 接口隔離原則
 * fileOutputStream 實(shí)現(xiàn)了接口 Closeable
 * 此接口用于負(fù)責(zé)流的關(guān)閉
 */
public class CloseUtils {
    public static void CloseStream (Closeable closeable) {
        if (closeable == null) {
            return;
        }
        try {
            closeable.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用地點(diǎn)

@Override
    public void put(String url, Bitmap bitmap) {
        Log.e("text123", "put: ");
        FileOutputStream fileOutputStream = null;
        try {
            File file = new File(cacheDir);
            if(!file.exists()) {
                file.mkdirs();//新建目錄
            }
            String newPath = "text0" + ".jpg"; //文件名
            File files = new File(file,newPath);
            fileOutputStream = new FileOutputStream(files);
            boolean compress = bitmap.compress(Bitmap.CompressFormat.PNG, 80, fileOutputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            Log.e("text123", "put: e = " + e.toString());
        } finally {
            CloseUtils.CloseStream(fileOutputStream);
        }
    }

中的

 CloseUtils.CloseStream(fileOutputStream);

6 迪米特原則
其實(shí)就是中介原則 適用于 多關(guān)系的業(yè)務(wù)邏輯中 比如有兩種關(guān)系他們的直接的聯(lián)系比較復(fù)雜的時(shí)候 可以在加入一個(gè)中間類來(lái)專門(mén)處理這樣的邏輯

代碼地址
https://github.com/zhoudakkk/design_pattern_day00.git

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末粪般,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子污桦,更是在濱河造成了極大的恐慌刊驴,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寡润,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡舅柜,警方通過(guò)查閱死者的電腦和手機(jī)梭纹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)致份,“玉大人变抽,你說(shuō)我怎么就攤上這事〉椋” “怎么了绍载?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)滔蝉。 經(jīng)常有香客問(wèn)我击儡,道長(zhǎng),這世上最難降的妖魔是什么蝠引? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任阳谍,我火速辦了婚禮,結(jié)果婚禮上螃概,老公的妹妹穿的比我還像新娘矫夯。我一直安慰自己,他們只是感情好吊洼,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布训貌。 她就那樣靜靜地躺著,像睡著了一般冒窍。 火紅的嫁衣襯著肌膚如雪递沪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天综液,我揣著相機(jī)與錄音区拳,去河邊找鬼。 笑死意乓,一個(gè)胖子當(dāng)著我的面吹牛樱调,可吹牛的內(nèi)容都是我干的约素。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼笆凌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼圣猎!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起乞而,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤送悔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后爪模,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體欠啤,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年屋灌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洁段。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡共郭,死狀恐怖祠丝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情除嘹,我是刑警寧澤写半,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站尉咕,受9級(jí)特大地震影響叠蝇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜年缎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一蟆肆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晦款,春花似錦炎功、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至坛怪,卻和暖如春淤齐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袜匿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工更啄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人居灯。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓祭务,卻偏偏與公主長(zhǎng)得像内狗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子义锥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • Python6大設(shè)計(jì)原則 閱讀目錄 內(nèi)容總覽 六大設(shè)計(jì)原則都有哪些 一柳沙、單一職責(zé)原則 二、里氏替換原則 三拌倍、依賴倒...
    tomtiddler閱讀 1,533評(píng)論 0 0
  • 軟件開(kāi)發(fā)是始于面向過(guò)程的 軟件開(kāi)發(fā)是始于面向過(guò)程的赂鲤,因?yàn)槊嫦蜻^(guò)程地解決問(wèn)題更直接,軟件本身就是一個(gè)解決問(wèn)題的過(guò)程柱恤;...
    侏羅紀(jì)猿閱讀 760評(píng)論 0 2
  • 他們?cè)谡f(shuō)話 他們?cè)趯?xiě)詩(shī) 他們不說(shuō)人話 他們裝逼在平時(shí) 哦数初,如我一番削片 哦,他們不會(huì)知心 啊梗顺,正確乃我嘲笑 哦泡孩,我...
    顧天放閱讀 140評(píng)論 5 1
  • 某天同時(shí)刷完了《了不起的蓋茨比》和《東京女子圖鑒》,有點(diǎn)受到激勵(lì)荚守,立即跳起來(lái),去學(xué)習(xí)练般。(無(wú)聊虛空的...
    oula_L閱讀 490評(píng)論 0 0