Try   HackMD

表象模式(Facade Pattern)

提供了一個統一的介面,用來存取次系統中的一群介面。表象定義了一個較高層次的介面,讓次系統更容易使用。
深入淺出設計模式

簡單範例

買了一個家庭劇院,擁有許多功能:播放器、投影機、自動螢幕、環繞音效、爆米花機。

但在我需要觀看電影時,我需要開啟螢幕、音效、爆米花機、播放器等流程才能看的了電影,該如何解決這種混亂?

我們利用表象模式呼叫表象物件中的方法幫我完成。

static void Main(string[] args) { Console.WriteLine("Facade Pattern!"); //Init Amplifier amplifier = new Amplifier(); CdPlayer cdPlayer = new CdPlayer(); Projector projector = new Projector(); HomeTheaterFacade homeTheater = new HomeTheaterFacade(amplifier,cdPlayer,projector); homeTheater.WatchMovie(); homeTheater.CloseMovie(); }

表象物件

public class HomeTheaterFacade { Amplifier amplifier; CdPlayer cdPlayer; Projector projector; public HomeTheaterFacade(Amplifier amplifier,CdPlayer cdPlayer,Projector projector){ this.amplifier = amplifier; this.cdPlayer = cdPlayer; this.projector = projector; } public void WatchMovie(){ Console.WriteLine("WatchMovie starting...."); amplifier.On(); cdPlayer.Play(); projector.On(); } public void CloseMovie(){ Console.WriteLine("CloseMovie starting...."); amplifier.Off(); cdPlayer.Stop(); projector.Off(); } }

劇院子系統

public class Amplifier { public void On(){ Console.WriteLine("Amplifier On"); } public void Off(){ Console.WriteLine("Amplifier Off"); } }
public class Projector { public void On(){ Console.WriteLine("DvdPlayer Play"); } public void Off(){ Console.WriteLine("DvdPlayer Stop"); } }
public class CdPlayer { public void Play(){ Console.WriteLine("CdPlayer Play"); } public void Stop(){ Console.WriteLine("CdPlayer Stop"); } }

結果

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

轉接器vs表象

  • 轉接器
    • 改變介面符合客戶期望
  • 表象
    • 提供次系統一個簡化介面

極少化守則

減少物件之間的互動,只和你的密友談話。

當你正在設計一個系統,不管是任何物件,都要注意和他互動的物件有哪些,並注意他和這些類別如何互動。
深入淺出設計模式

例如以某個物件而言,在這個物件內的方法中,只應該引用以下物件的方法:

  • 該物件本身
  • 被當作方法的參數而傳遞進來的動作
  • 此方法所建立或實體化的物件
  • 物件的任何元件

該物件本身:

class KeepSimple { private void Method1(){ Method2(); } private void Method2(){ } }

被當作方法的參數而傳遞進來的動作:

class KeepSimple { private void Method1(Class1 class1){ class1.Method1(); } } public abstract class Class1 { public abstract void Method1(); }

此方法所建立或實體化的物件:

class KeepSimple { private void Method1(){ Class1 class1 = new Class1(); class1.Method1(); } } public class Class1 { public void Method1(){ } }

物件的任何元件:

class KeepSimple { Class1 class1 = new Class1(); private void Method1(){ class1.Method1(); } } public class Class1 { public void Method1(){ } }

違反守則情形

class KeepSimple { private void Method1(){ Class1 class1 = new Class1(); Class2 class2 = class1.Method1(); } } public class Class1 { public Class2 Method1(){ return null; } } public class Class2{ public void Method1(){ } }