針對外觀模式,在項目開發和實際運用中十分頻繁,可是其極易理解,下面就簡要介紹一下。apache
外觀模式(Facade),他隱藏了系統的複雜性,並向客戶端提供了一個能夠訪問系統的接口。這種類型的設計模式屬於結構性模式。爲子系統中的一組接口提供了一個統一的訪問接口,這個接口使得子系統更容易被訪問或者使用。 設計模式
簡單來講,該模式就是把一些複雜的流程封裝成一個接口供給外部用戶更簡單的使用。這個模式中,設計到3個角色。學習
1).門面角色:外觀模式的核心。它被客戶角色調用,它熟悉子系統的功能。內部根據客戶角色的需求預約了幾種功能的組合。spa
2).子系統角色:實現了子系統的功能。它對客戶角色和Facade時未知的。它內部能夠有系統內的相互交互,也能夠由供外界調用的接口。設計
3).客戶角色:經過調用Facede來完成要實現的功能。code
1- 爲複雜的模塊或子系統提供外界訪問的模塊;blog
2- 子系統相互獨立;接口
3- 在層析結構中,可使用外觀模式定義系統的每一層的入口。開發
下面,咱們就經過一個簡單的例子來實現該模式。get
每一個Computer都有CPU、Memory、Disk。在Computer開啓和關閉的時候,相應的部件也會開啓和關閉,因此,使用了該外觀模式後,會使用戶和部件之間解耦。如:
代碼實現
首先是子系統類:
【代碼清單--1】
1 package com.huawei.facadeDesign.children; 2 3 import org.apache.log4j.Logger; 4 5 /** 6 * cpu子系統類 7 * @author Administrator 8 * 9 */ 10 public class CPU 11 { 12 public static final Logger LOGGER = Logger.getLogger(CPU.class); 13 public void start() 14 { 15 LOGGER.info("cpu is start..."); 16 } 17 18 public void shutDown() 19 { 20 LOGGER.info("CPU is shutDown..."); 21 } 22 }
【代碼清單--2】
1 package com.huawei.facadeDesign.children; 2 3 import org.apache.log4j.Logger; 4 5 /** 6 * Disk子系統類 7 * @author Administrator 8 * 9 */ 10 public class Disk 11 { 12 public static final Logger LOGGER = Logger.getLogger(Disk.class); 13 public void start() 14 { 15 LOGGER.info("Disk is start..."); 16 } 17 18 public void shutDown() 19 { 20 LOGGER.info("Disk is shutDown..."); 21 } 22 }
【代碼清單--3】
1 package com.huawei.facadeDesign.children; 2 3 import org.apache.log4j.Logger; 4 5 /** 6 * Memory子系統類 7 * @author Administrator 8 * 9 */ 10 public class Memory 11 { 12 public static final Logger LOGGER = Logger.getLogger(Memory.class); 13 public void start() 14 { 15 LOGGER.info("Memory is start..."); 16 } 17 18 public void shutDown() 19 { 20 LOGGER.info("Memory is shutDown..."); 21 } 22 }
而後是,門面類Facade
【代碼清單--4】
1 package com.huawei.facadeDesign.facade; 2 3 import org.apache.log4j.Logger; 4 5 import com.huawei.facadeDesign.children.CPU; 6 import com.huawei.facadeDesign.children.Disk; 7 import com.huawei.facadeDesign.children.Memory; 8 9 10 /** 11 * 門面類(核心) 12 * @author Administrator 13 * 14 */ 15 public class Computer 16 { 17 public static final Logger LOGGER = Logger.getLogger(Computer.class); 18 19 private CPU cpu; 20 private Memory memory; 21 private Disk disk; 22 public Computer() 23 { 24 cpu = new CPU(); 25 memory = new Memory(); 26 disk = new Disk(); 27 } 28 public void start() 29 { 30 LOGGER.info("Computer start begin"); 31 cpu.start(); 32 disk.start(); 33 memory.start(); 34 LOGGER.info("Computer start end"); 35 } 36 37 public void shutDown() 38 { 39 LOGGER.info("Computer shutDown begin"); 40 cpu.shutDown(); 41 disk.shutDown(); 42 memory.shutDown(); 43 LOGGER.info("Computer shutDown end..."); 44 } 45 }
最後爲,客戶角色。
【代碼清單--5】
1 package com.huawei.facadeDesign; 2 3 import org.apache.log4j.Logger; 4 5 import com.huawei.facadeDesign.facade.Computer; 6 7 /** 8 * 客戶端類 9 * @author Administrator 10 * 11 */ 12 public class Cilent { 13 public static final Logger LOGGER = Logger.getLogger(Cilent.class); 14 public static void main(String[] args) 15 { 16 Computer computer = new Computer(); 17 computer.start(); 18 LOGGER.info("================="); 19 computer.shutDown(); 20 } 21 22 }
【代碼清單--6】運行結果
從上面的實例來看,有了這個Facade類,也就是Computer類,用戶就不用親自去調用子系統中的Disk,Memory、CPU類了,不須要知道系統內部的實現細節,甚至都不用知道系統內部的構成。客戶端只須要跟Facade交互就能夠了。
使得客戶端和子系統之間解耦,讓子系統內部的模塊功能更容易擴展和維護;
客戶端根本不須要知道子系統內部的實現,或者根本不須要知道子系統內部的構成,它只須要跟Facade類交互便可。
有些方法是對系統外的,有些方法是系統內部相互交互的使用的。子系統把那些暴露給外部的功能集中到門面中,這樣就能夠實現客戶端的使用,很好的隱藏了子系統內部的細節。
...