里氏替換原則
簡(jiǎn)單來說就是,所有引用基類的地方,都能替換成對(duì)應(yīng)的子類,也就是說父類能出現(xiàn)的地方,都能夠用子類來替換
例如:
public class Window {
public void show(View child){
child.draw();
}
}
//抽象基類
public abstract class View {
public abstract void draw();
public void measure(int width ,int height){
//測(cè)量大小,統(tǒng)一處理
}
}
public class TextView extends View {
@Override
public void draw() {
//繪制 TextView
}
}
public class Button extends View {
@Override
public void draw() {
//繪制 button
}
}
如上,Window類依賴View,而View是所有視圖的抽象基類,measure()
方法是子類共享的,draw()
方法是抽象的,子類自己實(shí)現(xiàn)各種各樣的繪制功能. 這里任何繼承自 View 的子類都可以設(shè)置給Window來顯示出來
原來,里氏替換原則的核心是抽象和繼承; 利用抽象和繼承,可以把共享的內(nèi)容統(tǒng)一處理,把差異的抽象,通過繼承讓子類來實(shí)現(xiàn)
依賴倒置原則
依賴倒置原則有以下幾個(gè)特點(diǎn):
(1). 調(diào)用者不應(yīng)該直接依賴具體實(shí)現(xiàn)類,兩者都應(yīng)該依賴對(duì)應(yīng)的抽象
(2).抽象中不應(yīng)該直接依賴具體的實(shí)現(xiàn)類
(3).實(shí)現(xiàn)類應(yīng)該依賴抽象
也就是說,兩個(gè)實(shí)現(xiàn)類之間通過抽象類或者接口來關(guān)聯(lián),兩個(gè)實(shí)現(xiàn)類不發(fā)生直接的依賴關(guān)系
例如:
public class ImageLoader {
//默認(rèn)實(shí)現(xiàn)
private MemoryCache mImageCache = new MemoryCache();
public void setImageCache(MemoryCache cache){
mImageCache = cache;
}
public void displayImage( String url, ImageView imageView) {
Bitmap bitmap = mImageCache.get(url);
if(bitmap == null){
downloadImage(url,imageView);
}else {
imageView.setImageBitmap(bitmap);
}
}
}
這里ImageLoader
和MemoryCache
就直接發(fā)生了依賴關(guān)系,當(dāng)想要改變緩存策略的時(shí)候,要添加一個(gè)SD緩存,或者雙緩存,這個(gè)時(shí)候不但要改緩存類,同時(shí)也要修改ImageLoader這個(gè)類
遵循依賴倒置原則,兩個(gè)類不應(yīng)該直接依賴,修改為:
public class ImageLoader {
//通過引用抽象來依賴
private ImageCache mImageCache = new MemoryCache();
public void setImageCache(ImageCache cache){
mImageCache = cache;
}
public void displayImage( String url, ImageView imageView) {
Bitmap bitmap = mImageCache.get(url);
if(bitmap == null){
downloadImage(url,imageView);
}else {
imageView.setImageBitmap(bitmap);
}
}
}
只需要把原來的變量mImageCache
的類型MemoryCache
改為抽象ImageCache
通過引用抽象來發(fā)生依賴,setImageCache(ImageCache cache)
也是直接傳入抽象,當(dāng)需要改變緩存策略的時(shí)候,只需要修改對(duì)應(yīng)的抽象實(shí)現(xiàn)就行,不會(huì)影響到ImageLoader
的內(nèi)部邏輯代碼.保證了緩存系統(tǒng)的可擴(kuò)展性,擁有變化的能力,這就是依賴倒置原則
可以看出來,在面向?qū)ο笳Z言里面,抽象是非常重要的一種手段