参考:https://www.cnblogs.com/studydp/p/9535599.html
1什么是门面模式(外观模式)
2门面模式有什么优势
3门面模式有什么缺点
4怎么使用门面模式
定义:外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法,从而外观模式让客户和子系统之间避免了紧耦合。(举个例子:你想去淘宝上卖一本书,你需要先注册账号,将货品上架,设置价格,等待出售,你需要经过步骤才能去卖书(步骤不能省略),若都在上端实现,则上端和下端强耦合,这时候使用门面模式,降低耦合,一般用于分层架构)
2门面模式有什么优势:(1)、外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
(2)、外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。
3门面模式有什么劣势:(1)、如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了”开——闭原则“(不过这点也是不可避免)。
using System;
using System.Collections.Generic;
using System.Linq;
namespace FacedeModel
{
/// <summary>
/// 外观模式适合分层架构,中间层,创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法,从而外观模式让客户和子系统之间避免了紧耦合
///举个例子:例如你去超市买东西,必须要经过进去,买东西这两个步骤,不可避免,若全在上端完成则造成强耦合,影响过多则需要一个中间类来替代
///
/// </summary>
class Program
{
public abstract class AbsLoad
{
public abstract bool Load();
}
public abstract class AbsBuy
{
public abstract bool Buy();
}
public class HualianLoad : AbsLoad
{
public override bool Load()
{
return true;
}
}
public class HualianBuy : AbsBuy
{
public override bool Buy()
{
return true;
}
}
public abstract class AbsFacede
{
public abstract void BuySomething();
}
public class Facede : AbsFacede
{
private static AbsBuy Buy = new HualianBuy();
private static AbsLoad Load = new HualianLoad();
private Facede()
{ }
private static Facede facede = new Facede();
public static Facede CreateInstance()
{
return facede;
}
public override void BuySomething()
{
if (!Load.Load())
{
Console.WriteLine("未进入超市");
}
else if (!Buy.Buy())
{
Console.WriteLine("未买东西");
}
else
{
Load.Load();
Buy.Buy();
}
}
}
static void Main(string[] args)
{
Facede facede = Facede.CreateInstance();
facede.BuySomething();
}
}
}
在以下情况下可以考虑使用外观模式:
(1)、外一个复杂的子系统提供一个简单的接口
(2)、提供子系统的独立性
(3)、在层次化结构中,可以使用外观模式定义系统中每一层的入口。其中三层架构就是这样的一个例子。
总结:
Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。注意区分Facade模式、Adapter模式、Bridge模式与Decorator模式:
Facade模式注重简化接口
Adapter模式注重转换接口
Bridge模式注重分离接口(抽象)与其实现
Decorator模式注重稳定接口的前提下为对象扩展功能