初识
外观模式(Facade),为了系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
结构
角色
- SubSystem子类,子系统类集合实现子系统的功能,处理Facade对象指派的任务。注意子类中没有Facade的任何信息,即没有对Facade对象的引用。
- Facade外观类,知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象。
理解
外观模式,就是不管内部的结构有多复杂,把它们封装起来,设计一个统一调用它们的对外接口,这样,对客户与内部结构进行解耦。
应用
对于炒股新手来说,对于股票的一些知识是了解甚少的,而盲目的炒股会很大几率赔钱,所以,我们可以买基金,买基金相对来说比较安全,我们只需要把钱给基金经理人,他们会去负责买卖股票,而我们到时候坐着数钱就可以了。这里的基金相当属于外观类,有了基金,就不用我们对每一支股票进行了解,分析了。所以,可以说有了外观类,是将内部结构与客户进行解耦。
实现
class Program
{
static void Main(string[] args)
{
Fund fund = new Fund();
fund.BuyFund();
fund.SellFund();
Console.Read();
}
}
class Stock1
{
public void Sell()
{
Console.WriteLine("股票1卖出");
}
public void Buy()
{
Console.WriteLine("股票1买入");
}
}
class Stock2
{
public void Sell()
{
Console.WriteLine("股票2卖出");
}
public void Buy()
{
Console.WriteLine("股票2买入");
}
}
class Stock3
{
public void Sell()
{
Console.WriteLine("股票3卖出");
}
public void Buy()
{
Console.WriteLine("股票3买入");
}
}
class Fund
{
Stock1 gu1;
Stock2 gu2;
Stock3 gu3;
public Fund()
{
gu1 = new Stock1();
gu2 = new Stock2();
gu3 = new Stock3();
}
public void BuyFund()
{
gu1.Buy();
gu2.Buy();
gu3.Buy();
}
public void SellFund()
{
gu1.Sell();
gu2.Sell();
gu3.Sell();
}
}
优点
- 符合了依赖倒转原则,依赖于抽象不依赖与具体。
- 提高了灵活性,不管系统内部如何变化,只要不影响到外观对象,任你自由活动。
- 提高了安全性,想让你访问子系统的哪些业务就开通哪些逻辑,不在外观上开通的方法,你就访问不到。
何时应用
- 在设计初期阶段,要有意识将不同的两个层分离,比如三层架构,要考虑在UI层、B层与D层之间建立外观,可以为复杂的内部架构提供一个简单的接口,使耦合大大降低。
- 在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观可以提供一个简单的接口,减少它们之间的依赖。
- 在维护一个大型系统时,可能这个系统已经非常难以维护和扩展,可以开发一个外观类,提供设计粗糙或高度复杂的遗留代码的比较清晰的接口,让新系统与外观交互,做到调用外观即可。