Android開發設計模式六大原則之開閉原則

2021-09-19 03:53:14 字數 3875 閱讀 7414

​開閉原則定義:軟體中的物件(類,模組,函式等)應該對於擴充套件是開放的,對於修改是關閉的。英文全稱(open close principle),簡稱:ocp

在實際開發中常常會遇到這樣的問題,從別人那裡接手過來的**,還沒來的及熟悉**,專案就催著趕緊公升級,當你想使用乙個功能的時候,你可能發現專案裡有相關**,但是你又不敢用,你怕改出來問題,所以一般可能都會採取新增一塊功能一樣的**。其實這就是簡單的遵循了開閉原則。

上面的場景相信大家都遇見過,你不想你寫的**,被別人詬病吧。所以掌握開閉原則要領很有必要性。

//快取類

class

imagecache

//快取

public

void

put(string url,bitmap bitmap)

//快取

public bitmap get

(string url)

}//將載入imageview顯示類

class

imageloader

imageview.

settag

(url)

;//給imageview設定tag

mexecutorservice.

submit

(new

runnable()

//快取到記憶體

mimagecache.

put(url,bitmap);}

})}}

//sd卡快取類

public

class

diskcache

//將快取到本地

public

void

put(string localuri, bitmap bmp)

}然後更新imageloader類中的**:

//將載入imageview顯示類

class

imageloader

else

if(bitmap != null)

imageview.

settag

(url)

;//給imageview設定tag

mexecutorservice.

submit

(new

runnable()

//快取到記憶體

mimagecache.

put(url,bitmap)

;//新增**,快取到sd卡

mdiskcache.

put(url,bitmap);}

})}}

這樣就完成了新增快取到sd卡。你會發現,每次新增快取方式,都會修改原來的載入類**。這樣很可能會引入bug,就會發生,之前用的好好的功能,可能就突然不好用了。

知道了開閉原則之後,我們可以這樣想:對擴充套件開放,對修改關閉。那麼首先你的載入類得支援可擴充套件,而且無需修改即可被別人拿來使用。

說到擴充套件,我們一般會使用介面來定義,所有的擴充套件都要實現介面裡定義的功能。這裡我們說的是擴充套件快取方式,那自然要將快取定義成為介面。

//快取介面宣告

public

inte***ce

imagecache

so easy ! 不過多說明。

定義好了介面,那麼接下來,每乙個擴充套件方式都要實現該介面,這也起到了乙個約束的作用:

//擴充套件記憶體快取類 實現 imagecache 介面

public

class

memorycache

implements

imagecache

//快取

@override

public

void

put(string url,bitmap bitmap)

//快取

@override

public bitmap get

(string url)

}//擴充套件sd卡快取類 實現 imagecache 介面

public

class

diskcache

implements

imagecache

//快取

@override

public bitmap get

(string url)

}

我只實現了兩種快取方式,你也可以依葫蘆畫瓢,實現雙快取,就是我上面說的預設支援記憶體快取和本地快取。

那麼接下來我們應該怎麼修改imageloader類呢,很簡單,首先你要明白,既然所有的快取方式都擴充套件自imagecache ,那麼所有的擴充套件類又可以稱之為乙個imagecache。明白這一點,那下面的**就不難理解了。

//將載入imageview顯示類

class

imageloader

//載入

public

void

displayimage

(final string url,

final imageview imageview)

imageview.

settag

(url)

;//給imageview設定tag

mexecutorservice.

submit

(new

runnable()

//快取到記憶體

mimagecache.

put(url,bitmap);}

})}}

可以看到,imageloader中多了setimagecache()這個方法,這是讓imageloader按照你自定義的擴充套件快取方法進行工作的重要途徑。因為有了這個入口,你就可以像下面這樣,使用你擴充套件的快取方式,而且不用修改已有的載入類。

imageloader imageloader =

newimageloader()

;//設定你自己擴充套件的記憶體快取

imageloader.

setimagecache

(new

memorycache);

//或者設定你自己擴充套件的本地存快取

imageloader.

setimagecache

(new

diskcache);

//再或者設定你自己擴充套件的其他存快取方式

imageloader.

setimagecache

(new

othercache);

//再再或者,你可以直接在呼叫的時候,直接自定義快取方式

imageloader.

setimagecache

(new

imagecache()

@override

public bitmap get

(string url)..

.});

接下裡再看開閉原則的uml圖是不是就能看懂了:

寫在最後:改變世界,先從改變自己開始。—我說的

設計模式六大模式

定義 就乙個類而言,應該僅有乙個引起它變化的原因 否則類應該被拆分 分析 1.核心 控制類的粒度大小,將物件解耦,提高其內聚性。定義 軟體實體 類 模組 函式等 應該可以擴充套件,但是不可修改。分析 1.兩個特徵 對於擴充套件是開放的 open for extension 對於更改是封閉的 clos...

設計模式 六大設計原則

剛剛結束設計模式學習時,感覺哪哪的抓不住重點,雖然之前師傅給勾了寫比較重要的設計模式,但是給我的感覺設計模式怎麼全都乙個樣子。通過對一些文章的瀏覽,簡單的對設計原則總結了一下。設計模式,就是設計範例。是經典問題的解決方案,是可以讓學習者舉一反三的,有研究價值 有交流價值的例子。設計模式的本質是物件導...

設計模式 六大設計原則

solid s 單一職責原則 o 開放封閉原則 l 黎克特制代換原則 i 介面隔離原則 d 依賴倒轉原則 故事 手機拍攝ufo 定義 就乙個類而言,應該僅有乙個引起它變化的原因。通俗講就是我們不要讓乙個類承擔過多的職責。如果乙個類承擔的職責過多,就等於把這些職責耦合在一起,乙個職責的變化可能會削弱或...