物件導向六大原則 開閉原則

2021-07-14 21:19:41 字數 2918 閱讀 4664

接下來在這篇中介紹開閉原則,還是以imageloader載入為例說明

一、ocp定義是:軟體中的物件(類、模組、函式等)應該對於擴充套件是開放的,但是對於修改是封閉的。

public

class diskcache

//將快取到記憶體卡中

public

void

put(string url, bitmap bmp)catch (exception e)finally catch (ioexception e) }}

}}

相應的imageloader中也做了一些修改,**如下:

/**

* 類載入

*/public

class

imageloader

imageview.settag(url);

mexecutorservice.submit(new runnable()

if(imageview.gettag().equals(url))

mimagecache.put(url,bitmap);

}});

}public bitmap downloadimage(string imageurl)catch (exception e)

return bitmap;

}public

void

userdiskcache(boolean usediskcache)

}

大家可以看到僅僅新增了乙個sd卡快取,就修改了很多**,這樣的**其實很不堅強,如果在繼續增加乙個雙快取,也得進行修改imageloader並且新增乙個類,這樣弄起來很不方便。一般懶人都會有懶人的方法,這樣寫也不符合設計的原則,不靈活,擴充套件性也不好。

接下來我們很有必要去認真思考下,並且重構下**,大家可以觀察看到所有新增類都會去獲取快取中和放入物件的,那我們就可以把他們抽取出來,定義乙個介面,**如下:

public

inte***ce imagecache

然後重構記憶體快取**,sd卡快取,雙快取

記憶體快取:

public

class

memorycache

implements

imagecache

private

void

initimagecache() };}

@override

public

void

put(string url, bitmap bitmap)

@override

public bitmap get(string url)

}

sd卡快取

public

class

diskcache

implements

imagecache

//將快取到記憶體卡中

@override

public

void

put(string url, bitmap bmp)catch (exception e)finally catch (ioexception e) }}

}}

雙快取

public

class

doublecache

implements

imagecache

//先從記憶體快取中獲取,如果沒有,再從sd卡中獲取

@override

public bitmap get(string url)

return bitmap;

}}

接下來大家觀察下imageloader和之前的區別:

public

class

imageloader

public

void

displayimage(final string url, final imageview imageview)

imageview.settag(url);

mexecutorservice.submit(new runnable()

if(imageview.gettag().equals(url))

mimagecache.put(url,bitmap);

}});

}public bitmap downloadimage(string imageurl)catch (exception e)

return bitmap;

}}

大家可以看到修改後的imagecache並不是原來的imagecache,並且imageloader裡面新增加了乙個setimagecache(imagecache cache)方法,使用者可以通過這個方法來設定快取的實現,也就是通常說的依賴注入,也可以實現自定義。實現方法可以參考以下:

imageloader imageloader = new imageloader();

//使用記憶體快取

imageloader.setimagecache(new memorycache());

//使用sd卡快取

imageloader.setimagecache(new diskcache());

//使用雙快取

imageloader.setimagecache(new doublecache());

//使用自定義的快取實現

imageloader.setimagecache(new imagecache()

//從快取中獲取

@override

public bitmap get(string url)

});

物件導向六大原則(六) 開閉原則

出處 定義 乙個軟體實體如類 模組和函式應該對擴充套件開放,對修改關閉。問題由來 在軟體的生命週期內,因為變化 公升級和維護等原因需要對軟體原有 進行修改時,可能會給舊 中引入錯誤,也可能會使我們不得不對整個功能進行重構,並且需要原有 經過重新測試。解決方案 當軟體需要變化時,盡量通過擴充套件軟體實...

六大原則之開閉原則

軟體實體應當對擴充套件開放,對修改關閉 software entities should be open for extension,but closed for modification 這就是開閉原則的經典定義。開閉原則的含義是 當應用的需求改變時,在不修改軟體實體的源 或者二進位制 的前提下,...

物件導向 六大原則

舉乙個簡單的例子,登入功能。一般登入需要包括幾個基本的功能 1.登入頁面 2.接受使用者輸入 3.提交使用者輸入資料到服務端驗證 4.返回驗證結果並提示給使用者 按照單一原則我們就可以將登入功能拆分成兩個類,登入頁類和網路請求類。其實因為單一原則並不是很容易劃分,很多時候需要根據個人經驗和實際情況 ...