摘要
要判斷一個代碼是不是包含了
如果現在有一個類Parent
class Parent{
Child child;
void add(Girl girl){
}
}
因為上面Parent裡面用到了Child跟Girl這兩個類
示例
這是一個處理ZIP的程序
c:\f
目前的代碼就是
class ZipMainFrame extends Frame {
StatusBar sb;
void makeZip() {
String zipFilePath;
String srcFilePaths[];
//根據UI上給zipFilePath和srcFilePaths賦值
ZipEngine ze = new ZipEngine();
ze
}
void setStatusBarText(String statusText) {
sb
}
}
class ZipEngine {
void makeZip(String zipFilePath
//在該路徑上創建zip文件
for (int i =
//將srcFilePaths[i]的文件加到壓縮包中
f
}
}
}
我們還有一個存貨管理系統
現在
再往遠一點想
因為ZipEngine引用了ZipMainFrame這個類
一般來說
因此
為了可以重用ZipEngine
那怎麼做呢?回答這個問題之前
怎麼判斷是
方法
一個簡單的方法就是
這個方法很簡單
方法
另一個方法比較主觀
因此
class ZipEngine {
void makeZip(String zipFilePath
//在該路徑上創建zip文件
for (int i =
//將srcFilePaths[i]的文件加到壓縮包中
statusbar
}
}
}
現在
不過
方法
第
比如
方法
第
後一種方法是個
總結
要判斷一個代碼是不是包含了
方法
怎麼讓ZipEngine不再引用(依賴於)ZipMainFrame
現在我們來看看
我們用方法
因為我們不能重用ZipEngine
class TextModeApp {
void makeZip() {
String zipFilePath;
String srcFilePaths[];
ZipEngine ze = new ZipEngine();
ze
}
}
class ZipEngine {
void makeZip(String zipFilePath
//在該路徑上創建zip文件
for (int i =
//將srcFilePaths[i]的文件加到壓縮包中
System
}
}
再看一下原來的代碼是
class ZipEngine {
void makeZip(String zipFilePath
//在該路徑上創建zip文件
for (int i =
//將srcFilePaths[i]的文件加到壓縮包中
f
}
}
}
很明顯
代碼看起來一樣
class ZipEngine {
void makeZip(String zipFilePath
//在該路徑上創建zip文件
for (int i =
//將srcFilePaths[i]的文件加到壓縮包中
顯示信息
}
}
}
因為
interface MessageDisplay {
void showMessage(String msg);
}
將ZipEngine改為
class ZipEngine {
void makeZip(String zipFilePath
msgDisplay) {
//在該路徑上創建zip文件
for (int i =
//將srcFilePaths[i]的文件加到壓縮包中
msgDisplay
}
}
}
而MessageDisplay這個接口的兩個實現類就是
class ZipMainFrameMessageDisplay implements MessageDisplay {
ZipMainFrame f;
ZipMainFrameMessageDisplay(ZipMainFrame f) {
this
}
void showMessage(String msg) {
f
}
}
class SystemOutMessageDisplay implements MessageDisplay {
void showMessage(String msg) {
System
}
}
現在兩個系統也相應的做了修改
class ZipMainFrame extends Frame {
StatusBar sb;
void makeZip() {
String zipFilePath;
String srcFilePaths[];
//根據UI上給zipFilePath和srcFilePaths賦值
ZipEngine ze = new ZipEngine();
ze
}
void setStatusBarText(String statusText) {
sb
}
}
class TextModeApp {
void makeZip() {
String zipFilePath;
String srcFilePaths[];
ZipEngine ze = new ZipEngine();
ze
}
}
改進後的代碼
下面就是改進完的代碼
interface MessageDisplay {
void showMessage(String msg);
}
class ZipEngine {
void makeZip(String zipFilePath
msgDisplay) {
//在該路徑上創建zip文件
for (int i =
//將srcFilePaths[i]的文件加到壓縮包中
msgDisplay
}
}
}
class ZipMainFrame extends Frame {
StatusBar sb;
void makeZip() {
String zipFilePath;
String srcFilePaths[];
//根據UI上給zipFilePath和srcFilePaths賦值
ZipEngine ze = new ZipEngine();
ze
void showMessage(String msg) {
setStatusBarText(msg);
}
});
}
void setStatusBarText(String statusText) {
sb
}
}
class TextModeApp {
void makeZip() {
String zipFilePath;
String srcFilePaths[];
ZipEngine ze = new ZipEngine();
ze
void showMessage(String msg) {
System
}
});
}
}
引述
依賴反轉原則(Dependency Inversion Principle )表述
;
;
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26899.html