外观模式

外观模式

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. 定义

要求—个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。

image-20210408122726427

3. 评价

优点:

  1. 松耦合,解开客户端和子系统的耦合关系,可以让子系统能加容易扩展和维护
  2. 简单易用,客户端只要和外观进行交互就可以了
  3. 更好的划分层次,可以很好的隐藏系统内部的接口

缺点:

  1. 过多或是不合理的外观让人会迷惑,到底是用外观还是直接调用?

4. 思考

本质

封装交互,简化调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值