重要程度:★★★★★ 一、什麼是外觀模式 在子系統中的介面之上定義一個更高層次的介面,方便使用子系統中的介面; 二、補充說明 缺點:不符合開閉原則,修改子系統的代碼會影響高層介面代碼; 優點:引入外觀類可以降低系統的複雜度,提高了客戶端使用的便捷性; 優點:客戶類與子系統解耦; 三、角色 子系統角色
重要程度:★★★★★
一、什麼是外觀模式
在子系統中的介面之上定義一個更高層次的介面,方便使用子系統中的介面;
二、補充說明
缺點:不符合開閉原則,修改子系統的代碼會影響高層介面代碼;
優點:引入外觀類可以降低系統的複雜度,提高了客戶端使用的便捷性;
優點:客戶類與子系統解耦;
三、角色
子系統角色
外觀角色
客戶端角色
四、例子,JAVA實現
模擬電腦開機情景,有三個子系統:BIOS系統,硬碟系統,操作系統;啟動過程是先啟動BIOS, 然後載入硬碟,然後啟動操作系統;
子系統角色,BIOS系統
package com.pichen.dp.structuralpattern.facade; public class BIOS { public void start(){ System.out.println("BIOS start."); } }
子系統角色,硬碟系統
package com.pichen.dp.structuralpattern.facade; public class Disk { public void load(){ System.out.println("Disk load."); } }
子系統角色,操作系統
package com.pichen.dp.structuralpattern.facade; public class OS { /** * 假設啟動OS子系統需要用到Disk子系統作為入參 * start * TODO * @Title: start * @Description: TODO * @param @param disk * @return void * @throws */ public void start(Disk disk){ System.out.println("OS start."); } }
外觀角色,在子系統之上定義了一個更高層次介面,方便啟動PC
package com.pichen.dp.structuralpattern.facade; public class ComputerFacade { private BIOS bios; private Disk disk; private OS os; public ComputerFacade() { bios = new BIOS(); disk = new Disk(); os = new OS(); } public void start(){ bios.start(); disk.load(); os.start(disk); } }
客戶端角色,啟動PC, 如果不使用外觀模式,啟動PC較複雜,使用外觀模式,簡化了客戶端操作
package com.pichen.dp.structuralpattern.facade; public class Main { public static void main(String[] args) { ComputerFacade pc = new ComputerFacade(); pc.start(); //不使用外觀模式情況 // BIOS bios = new BIOS(); // Disk disk = new Disk(); // OS os = new OS(); // bios.start(); // disk.load(); // os.start(disk); } }
結果列印
BIOS start.
Disk load.
OS start.