開閉原則定義:軟體中的物件(類,模組,函式等)應該對於擴充套件是開放的,對於修改是關閉的。英文全稱(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 定義 就乙個類而言,應該僅有乙個引起它變化的原因。通俗講就是我們不要讓乙個類承擔過多的職責。如果乙個類承擔的職責過多,就等於把這些職責耦合在一起,乙個職責的變化可能會削弱或...