面向?qū)ο罅笤瓌t之單一職責原則

前言

從開始接觸面向?qū)ο箝_始就有對面向?qū)ο笤瓌t的了解拇惋,到目前為止也多次看到秒啦,可每次看到的時候缆巧,都有種似曾相識卻又驚嘆無比的感覺,這樣的感覺明顯是不對的莉炉,學完一些知識應該是融匯貫通于你的思想之中钓账,然后穿過你的身體,穿過你的靈魂再展現(xiàn)出來絮宁,所以我們要躬行于知識的沃土之上梆暮,讓那些讓規(guī)律,想法绍昂,知識啦粹,真正能穿過我們的靈魂,我們的身體窘游,然后再表達出來唠椭,基于此,我也想記錄一下我的所學忍饰,所知贪嫂!

定義

單一職責原則的英文名稱是 Single Responsibility Principle,簡稱SRP,它的定義是:就一個類而言艾蓝,應該僅有一個引起它變化的原因力崇。也就是說斗塘,一個類中應該是一組相關性很高的函數(shù)、數(shù)據(jù)的封裝亮靴。

應用

舉個栗子

比如這樣一個需求馍盟,寫一個圖片加載類,實現(xiàn)圖片加載台猴,并且要將圖片緩存起來朽合。

實現(xiàn)如下:

/**
 * 圖片加載類
 */
public class ImageLoader {
    //圖片緩存
    LruCache<String,Bitmap> mImageCache;
    //線程池,線程數(shù)量為CPU的數(shù)量
    ExecutorService mExecutorService = Executors.newFixedThreadPool(
            Runtime.getRuntime().availableProcessors());
    public ImageLoader(){
        initImageCache();
    }

    private void initImageCache() {
        //計算可使用的最大內(nèi)存
        final int maxMemory = (int)(Runtime.getRuntime().maxMemory() / 1024);
        //取四分之一的可用內(nèi)存作為緩存
        final int cacheSize = maxMemory / 4;
        mImageCache = new LruCache<String,Bitmap>(cacheSize){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getRowBytes() * value.getHeight() / 1024;
            }
        };
    }
    public void displayImage(final String url, final ImageView imageView) {
        imageView.setTag(url);
        mExecutorService.submit(new Runnable() {
            @Override
            public void run() {
                Bitmap bitmap = downloadImage(url);
                if (bitmap == null) {
                    return;
                }
                if (imageView.getTag().equals(url)) {
                    imageView.setImageBitmap(bitmap);
                }
                mImageCache.put(url,bitmap);
            }
        });
    }
    private Bitmap downloadImage(String imageUrl) {
        Bitmap bitmap = null;
        try {
            URL url = new URL(imageUrl);
            final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            bitmap = BitmapFactory.decodeStream(conn.getInputStream());
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }

}

我們來分析一下這個類饱狂,功能上是沒有問題的曹步,但把緩存功能的邏輯也雜糅到圖片加載類中,這明顯不符合單一職責原則休讳,更不要說擴展性讲婚、靈活性了,這樣隨著功能的增加俊柔,ImageLoader類只會越來越復雜筹麸。

那我們考慮一下怎么解耦?
那我們想一下,如果把圖片緩存相關代碼剝離出去怎么做雏婶。
我們可以把上面代碼中緩存圖片的LruCache對象交給一個專門的圖片緩存類處理物赶,類圖如下

對應代碼如下:

/**
 * 圖片緩存類
 */
public class ImageCache {
    //圖片LRU緩存
    LruCache<String,Bitmap> mImageCache;
    public ImageCache() {
        initImageCache();
    }

    private void initImageCache() {
        //計算可使用的最大內(nèi)存
        final int maxMemory = (int)(Runtime.getRuntime().maxMemory() / 1024);
        //取四分之一的可用內(nèi)存作為緩存
        final int cacheSize = maxMemory / 4;
        mImageCache = new LruCache<String,Bitmap>(cacheSize){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getRowBytes() * value.getHeight() / 1024;
            }
        };
    }
    public void put (String url,Bitmap bitmap) {
        mImageCache.put(url,bitmap);
    }
    public Bitmap get(String url) {
        return mImageCache.get(url);
    }
}

/**
 * 圖片加載類
 */
public class ImageLoader {
    //圖片緩存
    ImageCache mImageCache = new ImageCache();
    //線程池,線程數(shù)量為CPU的數(shù)量
    ExecutorService mExecutorService = Executors.newFixedThreadPool(
            Runtime.getRuntime().availableProcessors());

    public void displayImage(final String url, final ImageView imageView) {
        Bitmap bitmap = mImageCache.get(url);
        if (bitmap != null) {
            imageView.setImageBitmap(bitmap);
            return;
        }
        imageView.setTag(url);
        mExecutorService.submit(new Runnable() {
            @Override
            public void run() {
                Bitmap bitmap = downloadImage(url);
                if (bitmap == null) {
                    return;
                }
                if (imageView.getTag().equals(url)) {
                    imageView.setImageBitmap(bitmap);
                }
                mImageCache.put(url,bitmap);
            }
        });
    }
    private Bitmap downloadImage(String imageUrl) {
        Bitmap bitmap = null;
        try {
            URL url = new URL(imageUrl);
            final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            bitmap = BitmapFactory.decodeStream(conn.getInputStream());
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }
}

如上述代碼留晚,把ImageLoader一拆為二酵紫,ImageLoader只負責圖片加載的邏輯,ImageCache負責圖片處理的邏輯错维,這樣ImageLoader類的代碼少了奖地,職責也清晰了,當與緩存相關的需求需要改變時我們只需更改ImageCache類就可以了赋焕,當與加載圖片需求需要改變時我們只需修改ImageLoader類即可参歹,但此類的擴展靈活性也有所欠缺(此處涉及到開面向?qū)ο蟮牧硪粋€原則-開閉原則)

單一職責原則,主要就是單一兩個字隆判,也就是說 多個不一樣的功能不應該放到一個類中犬庇,一個類應該是一組相關性很高的函數(shù)、數(shù)據(jù)的封裝蜜氨。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末械筛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子飒炎,更是在濱河造成了極大的恐慌埋哟,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赤赊,居然都是意外死亡闯狱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門抛计,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哄孤,“玉大人,你說我怎么就攤上這事吹截∈莩拢” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵波俄,是天一觀的道長晨逝。 經(jīng)常有香客問我,道長懦铺,這世上最難降的妖魔是什么捉貌? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮冬念,結果婚禮上趁窃,老公的妹妹穿的比我還像新娘。我一直安慰自己急前,他們只是感情好醒陆,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著裆针,像睡著了一般统求。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上据块,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音折剃,去河邊找鬼另假。 笑死,一個胖子當著我的面吹牛怕犁,可吹牛的內(nèi)容都是我干的边篮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼奏甫,長吁一口氣:“原來是場噩夢啊……” “哼戈轿!你這毒婦竟也來了?” 一聲冷哼從身側響起阵子,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤思杯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體色乾,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡誊册,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了暖璧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片案怯。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖澎办,靈堂內(nèi)的尸體忽然破棺而出嘲碱,到底是詐尸還是另有隱情,我是刑警寧澤局蚀,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布麦锯,位于F島的核電站,受9級特大地震影響至会,放射性物質(zhì)發(fā)生泄漏离咐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一奉件、第九天 我趴在偏房一處隱蔽的房頂上張望宵蛀。 院中可真熱鬧,春花似錦县貌、人聲如沸术陶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梧宫。三九已至,卻和暖如春摆碉,著一層夾襖步出監(jiān)牢的瞬間塘匣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工巷帝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忌卤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓楞泼,卻偏偏與公主長得像驰徊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子堕阔,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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