天天看點

外觀(門面)模式 (Facade Pattern)外觀模式的優點

定義:為子系統中的一組接口提供一個一緻的界面,facaede模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。

案例:

2 投資者買股片vs基金

投資者買股票,需要了解股票的各種資訊,預測它的未來,風險反而大

投資者買基金,基金經理人相對專業,不容易像散戶那麼盲目,基金經理人拿這些錢去做投資,然後大家獲利

由于在衆多投資者對衆多股票的聯系太多,反而不利于操作,耦合性過高。而有了基金以後,變成了衆多使用者隻和基金打交道,實際的操作卻是基金經理人在與上千隻股票和其他投資産品打交道。

外觀(門面)模式 (Facade Pattern)外觀模式的優點
class Stock1
{
	public void Sell()
	{
		System.out.println("股票1賣出");
	}
	public void Buy()
	{
		System.out.println("股票1買入");
	}
}
class Stock2
{
	public void Sell()
	{
		System.out.println("股票2賣出");
	}
	public void Buy()
	{
		System.out.println("股票2買入");
	}
}
class Stock3
{
	public void Sell()
	{
		System.out.println("股票3賣出");
	}
	public void Buy()
	{
		System.out.println("股票3買入");
	}
}
class NationalDebt1
{
	public void Sell()
	{
		System.out.println("國債賣出");
	}
	public void Buy()
	{
		System.out.println("國債買入");
	}
}
class Realty
{
	public void Sell()
	{
		System.out.println("房地産賣出");
	}
	public void Buy()
	{
		System.out.println("房地産買入");
	}
}
class Fund
{
	Stock1 gu1;
	Stock2 gu2;
	Stock3 gu3;
	NationalDebt1 nd1;
	Realty rt1;
	public Fund() {
		gu1=new Stock1();
		gu2=new Stock2();
		gu3=new Stock3();
		nd1=new NationalDebt1();
		rt1=new Realty();
	}
	public void BuyFund()
	{
		gu1.Buy();
		gu2.Buy();
		gu3.Buy();
		nd1.Buy();;
		rt1.Buy();;
		
	}
	public void SellFund()
	{
		gu1.Sell();
		gu2.Sell();
		gu3.Sell();
		nd1.Sell();
		rt1.Sell();
	}
}

public class main
{
	public static void main(String[] args) {
		Fund jijin=new Fund();
		jijin.BuyFund();
		jijin.SellFund();}
}
           

 此時,使用者不需要了解股票,甚至可以對股票一無所知,買過基金過一段時間後再贖回就可以數錢了。參與股票的具體買賣都由基金公司完成。

基金類是系統中一組接口的封裝界面,也就是高層接口,通過調用高層接口,可以直接調用一組子接口而不需要了解子接口是如何實作的,具有高度保密性和代碼複用性。

class SubSystemOne
{
	public void MethodOne()
	{
		System.out.println("子系統方法一");
	}
}
class SubSystemTwo
{
	public void MethodTwo()
	{
		System.out.println("子系統方法二");
	}
}
class SubSystemThree
{
	public void MethodThree()
	{
		System.out.println("子系統方法三");
	}
}
class SubSystemFour
{
	public void MethodFour()
	{
		System.out.println("子系統方法四");
	}
}
class Facade//外觀類
{
	SubSystemOne one;
	SubSystemTwo Two;
	SubSystemThree Three;
	SubSystemFour Four;
	public Facade()
	{
		one=new SubSystemOne();
		Two=new SubSystemTwo();
		Three=new SubSystemThree();
		Four=new SubSystemFour();
	}
	public void MethodA()
	{
		System.out.println("\n方法組A()");
		one.MethodOne();
		Two.MethodTwo();
		Four.MethodFour();
	}
	public void MethodB()
	{
		System.out.println("\n方法組B()");
		Two.MethodTwo();
		Three.MethodThree();
		
	}
}
public class main
{
	public static void main(String[] args) {
		Facade facade=new Facade();
		facade.MethodA();
		facade.MethodB();
	}
}
           

保安系統的例子

一個保安系統由兩個錄像機,三個電燈,一個遙感器和一個警報器組成

保安系統的操作人員需要經常将這些儀器啟動和關閉。

外觀模式使用的三個階段:

  1. 設計初期,應該有意識将不同的兩個層分離,這樣可以為複雜的子系統提供一個簡單的接口使得耦合度大大降低。
  2. 在開發階段,子系統往往因為不斷的重構演化而變得越來越複雜,增加外觀Facaed可以提供一個簡單的接口,減少它們之間的依賴。
  3. 在維護一個遺留的大型系統時,可以使用外觀模式Facaed:為新系統開發一個外觀Facaed類,來提供設計粗糙或高度複雜的遺留代碼的比較清晰的簡單接口,讓新系統與Facaed對象互動。希望包裝或隐藏原有系統

外觀模式的優點

  1. 屏蔽了外部用戶端和系統内部模闆的互動。
  2. Facaed的功能可以被多個用戶端調用,可以實作複用
  3. 對使用Facaed的人員來說,Facaed大大的節省了他們的學習成本。

本質:

封裝互動,簡化調用

繼續閱讀