設(shè)計模式(七)門面模式(Facade)-結(jié)構(gòu)型
來源:程序員人生 發(fā)布時間:2015-06-27 08:33:52 閱讀次數(shù):3599次
門面模式Facade
門面模式:統(tǒng)之間的接口、框架之間的銜接
(1)使用接口的情勢來開發(fā),不需要知道接口中內(nèi)部方法的實現(xiàn);
(2)門面模式就是為子系統(tǒng)對外提供的1組接口提供1個統(tǒng)1的界面,使得其他系統(tǒng)對該系統(tǒng)的訪問都通過這個統(tǒng)1的界面來完成。
(3)當(dāng)1個負載的系統(tǒng)需要對外提供接口時,就需要將對提供的接口統(tǒng)1封裝在外觀類里,供外系統(tǒng)使用。
門面模式原理圖

門面模式原理圖
不用門面設(shè)計模式的情況
Holiday.java
public class Holiday {
public double getHoliday(String empno) {
return 2;
}
}
Salary.java
public class Salary {
public double getSalary(String empno){
return 2000;
}
}
Tax.java
public class Tax {
public double getTax(String empno) {
return 0;
}
}
客戶端Client.java
public class Client {
public static void main(String[] args) {
Salary salary = new Salary();
Holiday holiday = new Holiday();
Tax tax = new Tax();
double money = salary.getSalary("100222") * holiday.getHoliday("100222")/30 - tax.getTax("100222");
System.out.println(money);
}
}
客戶端會和幾個類的聯(lián)系程度較大;為使客戶端程序盡可能的減少,我們把計算薪水的代碼塊抽取到1個類里:
SalaryComputer.java
public class SalaryCoumputer {
public double doSalary() {
Salary salary = new Salary();
Holiday holiday = new Holiday();
Tax tax = new Tax();
double money = salary.getSalary("100222") * holiday.getHoliday("100222")/30 - tax.getTax("100222");
return money;
}
}
客戶端程序變成:
public class Client {
public static void main(String[] args) {
SalaryCoumputer salaryCoumputer = new SalaryCoumputer();
System.out.println(salaryCoumputer.doSalary());
}
}
如果有多個計算薪水,就不合適了,所以可以再把計算薪水的類換成1個接口
Computer.java
public interface Computer {
public double doSalary(String empno);
}
SalaryComputer.java
public class SalaryCoumputer implements Computer{
public double doSalary(String empno) {
Salary salary = new Salary();
Holiday holiday = new Holiday();
Tax tax = new Tax();
double money = salary.getSalary("100222") * holiday.getHoliday("100222")/30 - tax.getTax("100222");
return money;
}
}
1個專門讀取properties屬性文件的類
public class PropertiesUtil {
static Properties p = new Properties();
public static Object getInstance() {
InputStream in = null;
Object obj = null;
try {
in = PropertiesUtil.class.getClassLoader().getResourceAsStream("class.properties");
p.load(in);
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
obj = (Object) Class.forName((String) PropertiesUtil.getValue("class")).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return obj;
}
public static Object getValue(String key) {
return p.get(key);
}
}
Client.java
public class Client {
public static void main(String[] args) {
Computer computer = (Computer)PropertiesUtil.getInstance();
System.out.println(computer.doSalary("100222"));
}
}
利用如:JDBC的封裝springJDBC的封裝。
使用環(huán)境和優(yōu)點
《設(shè)計模式》給出了門面模式的使用環(huán)境:
(1)當(dāng)你要為1個復(fù)雜子系統(tǒng)提供1個簡單接口時。在上面已描寫了緣由。
(2) 客戶程序與抽象類的實現(xiàn)部份之間存在著很大的依賴性。引入 facade 將這個子系統(tǒng)與客戶和其他的子系統(tǒng)分離,可以提高子系統(tǒng)的獨立性和可移植性(上面也提到了)。
(3)當(dāng)你需要構(gòu)建1個層次結(jié)構(gòu)的子系統(tǒng)時,使用 facade 模式定義子系統(tǒng)中每層的入口點。如果子系統(tǒng)之間是相互依賴的,你可讓它們僅通過 facade 進行通訊,從而簡化了它們之間的依賴關(guān)系。
優(yōu)點:
(1)它對客戶屏蔽子系統(tǒng)組件,因此減少了客戶處理的對象的數(shù)目并使得子系統(tǒng)使用起來更加方便。
(2)它實現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系,而子系統(tǒng)內(nèi)部的功能組件常常是緊耦合的。松耦合關(guān)系使得子系統(tǒng)的組件變化不會影響到它的客戶。 Facade 模式有助于建立層次結(jié)構(gòu)系統(tǒng),也有助于對對象之間的依賴關(guān)系分層。 Facade 模式可以消除復(fù)雜的循環(huán)依賴關(guān)系。這1點在客戶程序與子系統(tǒng)是分別實現(xiàn)的時候尤其重要。在大型軟件系統(tǒng)中下降編譯依賴性相當(dāng)重要。在子系統(tǒng)類改變時,希望盡可能減少重編譯工作以節(jié)省時間。用
Facade 可以下降編譯依賴性,限制重要系統(tǒng)中較小的變化所需的重編譯工作。 Facade 模式一樣也有益于簡化系統(tǒng)在不同平臺之間的移植進程,由于編譯1個子系統(tǒng)1般不需要編譯所有其他的子系統(tǒng)。
(3) 如果利用需要,它其實不限制它們使用子系統(tǒng)類。因此你可讓客戶程序在系統(tǒng)易用性和通用性之間加以選擇。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈