当前位置: 首页 >  网技达人 >  设计模式(十)外观

设计模式(十)外观

导读:一、定义.为子系统中的一组接口提供一个一致的入口,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式是一种结构型模式。.二、描述.包含以下两个角色:1、Facade(外观角色):.在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或多个)子系统的功能

一、定义

为子系统中的一组接口提供一个一致的入口,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式是一种结构型模式。

二、描述

包含以下两个角色:1、Facade(外观角色): 在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统中去,传递给相应的子系统对象处理。
2、SubSystem(子系统角色): 在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另一个客户端而已。

三、例子

X公司想要开发一个可应用于多个软件的文件加密模块,该模块可以对文件中的数据进行加密并将加密后的数据存储在一个新文件中,具体的流程包括3个部分,分别是读取源文件、加密、保存加密之后的文件。其中,读取文件和保存文件使用流来实现,加密操作通过求模运算实现。这3个操作相对独立,为了实现代码地独立重用,让设计更加符合单一职责原则,这3个操作的业务代码封装在3个不同的类中。FileReader、CipherMachie、FileWriter:文件读取类、数据加密类、文件保存类,充当子系统类

public class FileReader
{
    public string Read(string fileNameSrc)
    {
        Console.WriteLine("读取文件,获取明文:");
        FileStream fs = null;
        StringBuilder sb = new StringBuilder();
        try
        {
            fs = new FileStream(fileNameSrc, FileMode.Open);
            int data;
            while ((data = fs.ReadByte()) != -1)
            {
                sb.Append((char)data);
            }
            fs.Close();
            Console.WriteLine(sb.ToString());
        }
        catch (FileNotFoundException e)
        {
            Console.WriteLine("文件不存在");
        }
        catch (IOException e)
        {
            Console.WriteLine("文件操作错误");
        }
        return sb.ToString();
    }
}

public class CipherMachine
{
    public string Encrypt(string plainText)
    {
        Console.WriteLine("数据加密,将明文转换为密文:");
        string es = "";
        char[] chars = plainText.ToCharArray();
        foreach (char ch in chars)
        {
            string c = (ch % 7).ToString();
            es += c;
        }
        Console.WriteLine(es);
        return es;
    }
}

public class FileWriter
{
    public void Write(string encryptedStr, string fileNameDes)
    {
        Console.WriteLine("保存密文,写入文件");
        FileStream fs = null;
        StringBuilder sb = new StringBuilder();
        try
        {
            fs = new FileStream(fileNameDes, FileMode.Create);
            byte[] str = Encoding.Default.GetBytes(encryptedStr);
            fs.Write(str, 0, str.Length);
            fs.Flush();
            fs.Close();
        }
        catch (FileNotFoundException e)
        {
            Console.WriteLine("文件不存在");
        }
        catch (IOException e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine("文件操作错误");
        }
    }
}

EncrytFacade:外观类

public class EncryptFacade
{
    private FileReader reader;
    private CipherMachine cipher;
    private FileWriter writer;

    public EncryptFacade()
    {
        reader = new FileReader();
        cipher = new CipherMachine();
        writer = new FileWriter();
    }

    public void FileEncrypt(string fileNameSrc, string fileNameDes)
    {
        string plainStr = reader.Read(fileNameSrc);
        string encryptedStr = cipher.Encrypt(plainStr);
        writer.Write(encryptedStr, fileNameDes);
    }
}

Program:客户端测试类

EncryptFacade facade = new EncryptFacade();
facade.FileEncrypt("src.txt", "des.txt");
Console.ReadLine();

四、总结

1、优点

(1)它对客户端屏蔽了子系统组件,减少了客户端需要处理的对象数目,并且使得子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少。
(2)它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可。
(3)一个子系统的修改对于其他子系统没有任何影响,而且子系统的内部变化也不会影响到外观对象。

2、缺点

(1)外观模式不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性。
(2)如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。

内容
  • jenkins~权限控制
    jenkins~权限控制
    2023-12-10
    jenkins上管理的任务比较多,这时需要有一定的权限管控机制,我们选择了插件Role-based Authorizat
  • RocketMQ消费者是如何负载均衡的
    RocketMQ消费者是如何负载
    2023-12-09
    摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )
  • 千乎万唤始出来,支持gpt3和gpt4支持画图,的在线gpt应用接入案例开源上线啦
    千乎万唤始出来,支持gpt3和g
    2023-12-04
    了解OPEN AI 平台用户一直在说,这个接口要怎么对接,如何在体验。 由于我一直忙于接口中台开发,所以在线基于OPEN
  • FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
    FlashDuty Change
    2023-12-04
    FlashDuty:一站式告警响应平台,前往此地址免费体验!.FlashDuty.现在已经全面支持了深色模式,这为您提供
  • 园林绿化工程
    园林绿化工程
    2024-01-05
    园林绿化工程产品介绍.产品功能.园林绿化工程是一项专业化的服务,旨在打造美丽的绿色环境。我们的园林绿化工程团队致力于设计
  • 园林休闲座椅制作
    园林休闲座椅制作
    2024-01-20
    园林休闲座椅制作.产品功能.园林休闲座椅是专门为户外休闲空间设计制作的座椅产品。产品具有耐候性强、外观美观、舒适度高等特
  • 绿化苗木种植
    绿化苗木种植
    2023-12-06
    绿化苗木种植.产品功能.绿化苗木种植是一种专门用于城市绿化的服务,通过种植各种绿化苗木来改*城市环境,提高空气质量,增加
  • 室外雕塑设计与**
    室外雕塑设计与**
    2023-12-06
    室外雕塑设计与**.产品功能.我们的室外雕塑设计与**服务旨在为客户提供高品质的室外雕塑,满足各种不同场合的需求。我们拥
  • 园林景观设计
    园林景观设计
    2023-12-11
    园林景观设计产品介绍.产品功能.园林景观设计是一项专业的设计服务,主要用于规划和设计公共和私人的园林空间。其功能包括根据
  • 排水**设计施工
    排水**设计施工
    2023-12-26
    排水**设计施工.产品功能.我们的排水系*设计施工服务旨在解决建筑物排水问题,确保排水系*的高效运行。我们提供全面的设计
  • 喷泉景观设计
    喷泉景观设计
    2024-01-05
    喷泉景观设计.喷泉是一种极具观赏性和装饰性的景观设计元素,它不仅可以为周围的环境增添一份生气与动感,更可以为人们带来一份
  • 公园景观规划设计
    公园景观规划设计
    2024-01-10
    公园景观规划设计.产品功能.我们的公园景观规划设计产品旨在为城市和乡村地区提供高质量的公共休闲空间。我们致力于通过规划和
  • 园林绿化养护服务
    园林绿化养护服务
    2024-01-10
    园林绿化养护服务.产品功能.园林绿化养护服务是一项专业的服务,旨在为客户提供全方位的园林绿化管理和养护服务。我们团队的专
  • 园林木艺制作
    园林木艺制作
    2023-12-11
    园林木艺制作.产品功能.园林木艺制作是一种以天然木材为原材料,通过手工制作而成的艺术品,具有装饰、实用和环保的功能。这些