外观模式(门面模式):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
举例:炒股。一个人炒股风险大,对于股票联系太多,不利于操作,也就是耦合性过高。很多人选择基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,基金会买几十支股票,用户只和基金打交道,实际的操作是基金经理人和股票以及其他投资打交道。
结构图:
代码:
基金类:
class Fund
{
Stock1 gu1;
Stock2 gu2;
Stock3 gu3;
NationalDebt1 nd1;
Realty1 rt1;
public Fund()
{
gu1 = new Stock1();
gu2 = new Stock2();
gu3 = new Stock3();
nd1 = new NationalDebt1();
rt1 = new Realty1();
}
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();
}
}
具体股票,国债,房产类:
//股票1
class Stock1
{
//卖股票
public void Sell()
{
Console.WriteLine("股票1卖出");
}
//买股票
public void Buy()
{
Console.WriteLine("股票1买入");
}
}
//股票2
class Stock2
{
//卖股票
public void Sell()
{
Console.WriteLine("股票2卖出");
}
//买股票
public void Buy()
{
Console.WriteLine("股票2买入");
}
}
//股票3
class Stock3
{
//卖股票
public void Sell()
{
Console.WriteLine("股票3卖出");
}
//买股票
public void Buy()
{
Console.WriteLine("股票3买入");
}
}
//国债1
class NationalDebt1
{
//卖股票
public void Sell()
{
Console.WriteLine("国债1卖出");
}
//买股票
public void Buy()
{
Console.WriteLine("国债1买入");
}
}
//房地产1
class Realty1
{
//卖股票
public void Sell()
{
Console.WriteLine("房地产1卖出");
}
//买股票
public void Buy()
{
Console.WriteLine("房地产1买入");
}
}
客户端:
static void Main(string[] args)
{
Fund jijin = new Fund();
//基金购买
jijin.BuyFund();
//基金赎回
jijin.SellFund();
Console.Read();
}
分析:
主要是定义一个接口,接口来与上下两部分交互,减少上下两部分的依赖。
基金类:知道那些子系统类负责处理请求,将客户的请求代理给基金类。把那些买入卖出股票的行为有基金经理人负责。
下面股票等的子系统类集合,实现子系统的功能,处理基金类对象指派的买卖任务。没有对基金类的引用,全部是自己的方法。
使用情况:
首先,在设计初期阶段,应该要有意识的将不同的两个曾分离,层与层之间简历外观类,如上面的基金类。其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观类可以提供一个简单的接口,减少它们之间的依赖。第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了。可以为新系统开发一个外观Facede类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。如下: