外观模式
1. 引入
例子:写信
需要四个步骤,写信的内容——写信封地址、收信人——把信封好——寄信
代码实现:
#region 普通的实现方法
/// <summary>
/// 写信过程的接口
/// </summary>
public interface ILetterProcess
{
/// <summary>
/// 写信
/// </summary>
/// <param name="context"></param>
void writeContext(string context);
/// <summary>
/// 写地址
/// </summary>
/// <param name="adress"></param>
void fillEnvelope(string adress);
/// <summary>
/// 把信放在信封
/// </summary>
void letterIntoEnvelope();
/// <summary>
/// 放到邮局
/// </summary>
void sendLetter();
}
/// <summary>
/// 写信的过程实现
/// </summary>
public class LetterPocessImp : ILetterProcess
{
public void writeContext(string context)
{
Console.WriteLine("填写信的内容 " + context);
}
public void fillEnvelope(string adress)
{
Console.WriteLine("填收信人的信息 " + adress);
}
public void letterIntoEnvelope()
{
Console.WriteLine("封装信封");
}
public void sendLetter()
{
Console.WriteLine("寄信");
}
}
/// <summary>
/// 具体实现场景
/// </summary>
public class DoWrite
{
public void Test()
{
ILetterProcess letterProcess = new LetterPocessImp();
letterProcess.writeContext("你好,小明....");
letterProcess.fillEnvelope("大连工业大学");
letterProcess.letterIntoEnvelope();
letterProcess.sendLetter();
Console.ReadKey();
}
}
#endregion
分析:
这样写,十分的不合理,一是要严格按照顺序写,二是如果信件多了话很不方便。这样需要一个方法把这些步骤给封装在一起,然后高层的模块只要和它交互就好了。
代码如下:
#region 优化实现
/// <summary>
/// 自动化邮局
/// </summary>
public class ModenPostOffice
{
private ILetterProcess letterProcess = new LetterPocessImp();
public void sendLetter(string context,string adress)
{
letterProcess.writeContext(context);
letterProcess.fillEnvelope(adress);
letterProcess.letterIntoEnvelope();
letterProcess.sendLetter();
Console.ReadKey();
}
}
public class DoWrite1
{
public void Test()
{
ModenPostOffice modenPostOffice = new ModenPostOffice();
modenPostOffice.sendLetter("你好,小明....", "大连工业大学");
}
}
#endregion
这样封装了以后,只要和现代化的邮局进行互动就可以了,这样写不仅简单,而且扩展性比较好。比如说现在要对寄往北京的信进行安全检查。
代码如下:
#region 添加检查
public class Police
{
public void checkLetter(ILetterProcess letterProcess)
{
Console.WriteLine(letterProcess + "信件已检查");
}
}
public class ModenPostOfficeCheck
{
private ILetterProcess letterProcess = new LetterPocessImp();
private Police police = new Police();
public void sendLetter(string context, string adress)
{
letterProcess.writeContext(context);
letterProcess.fillEnvelope(adress);
letterProcess.letterIntoEnvelope();
//检察信件
police.checkLetter(letterProcess);
letterProcess.sendLetter();
Console.ReadKey();
}
}
public class DoWrite2
{
public void Test()
{
ModenPostOfficeCheck modenPostOffice = new ModenPostOfficeCheck();
modenPostOffice.sendLetter("你好,小明....", "大连工业大学");
}
}
#endregion
这样高层的模块没有改动,信件已经被检查过了
2. 定义
要求—个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
3. 评价
优点:
- 松耦合,解开客户端和子系统的耦合关系,可以让子系统能加容易扩展和维护
- 简单易用,客户端只要和外观进行交互就可以了
- 更好的划分层次,可以很好的隐藏系统内部的接口
缺点:
- 过多或是不合理的外观让人会迷惑,到底是用外观还是直接调用?
4. 思考
本质
封装交互,简化调用