设计模式之外观模式
外观模式定义
外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。
外观模式实现
场景:小明最近入坑理财了,就去炒股票,由于是新手,对证券金融理财等都没有建立完善的体系,导致最后血亏。后来听朋友建议去买基金,基金是由众多支股票组合而成的,由专业的基金经理管理投资,相当于买了一揽子股票,最终小明只需要在合适的时机买入和卖出,而不用过多的去关心买啥股票,这里使用外观模式简单实现一下。
实现方式
- 考虑能否在现有子系统的基础上提供一个更简单的接口。 如果该接口能让客户端代码独立于众多子系统类。
- 在一个新的外观类中声明并实现该接口。 外观应将客户端代码的调用重定向到子系统中的相应对象处。 如果客户端代码没有对子系统进行初始化, 也没有对其后续生命周期进行管理, 那么外观必须完成此类工作。
- 如果要充分发挥这一模式的优势, 你必须确保所有客户端代码仅通过外观来与子系统进行交互。 此后客户端代码将不会受到任何由子系统代码修改而造成的影响, 比如子系统升级后, 你只需修改外观中的代码即可。
- 如果外观变得过于臃肿, 你可以考虑将其部分行为抽取为一个新的专用外观类。
伪代码示例
首先创建一些股票
public class Stock1 : BaseStock
{
public override void Buy()
{
Console.WriteLine("买入股票1");
}
public override void Sell()
{
Console.WriteLine("卖出股票1");
}
}
....
创建基类类
public class Fund
{
private Stock1 stock1;
private Stock2 stock2;
private Stock3 stock3;
public Fund()
{
stock1 = new Stock1();
stock2 = new Stock2();
stock3 = new Stock3();
}
public void BuyFund()
{
stock1.Buy();
stock2.Buy();
stock3.Buy();
}
public void SellFund()
{
stock1.Sell();
stock2.Sell();
stock3.Sell();
}
}
写的比较粗糙,主要就是简单去模拟基金经理买入和赎回股票
接着客户端调用,购买基金
static void Main(string[] args)
{
Fund fund = new Fund();
fund.BuyFund();
fund.SellFund();
Console.WriteLine("Press Any Key to end!");
Console.ReadKey();
}
外观模式优缺点
优点
- 可以让自己的代码独立于复杂子系统。
缺点
- 外观可能成为与程序中所有类都耦合的上帝对象。
外观模式使用场景
- 如果你需要一个指向复杂子系统的直接接口, 且该接口的功能有限,则可以使用外观模式。
- 如果需要将子系统组织为多层结构,可以使用外观。