设计模式(十)外观

这篇具有很好参考价值的文章主要介绍了设计模式(十)外观。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、定义

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

二、描述

包含以下两个角色:设计模式(十)外观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)如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。文章来源地址https://www.toymoban.com/news/detail-729717.html

到了这里,关于设计模式(十)外观的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式之~外观模式

    定义:         为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 结构图: 区分中介模式: 门面模式对外提供一个接口 中介模式对内提供一个接口 优点: 松耦合:用户与子系统解耦,屏蔽子系统;可以

    2024年02月07日
    浏览(38)
  • 设计模式-外观模式

         外观模式(Facade Pattern)是属于结构型的设计模式,它的主要目的是为子系统中的一组接口提供一个统一且更简单的接口,还简化了客户端调用子系统功能的过程。 1 Facade(外观类) : Facade 类提供了对子系统的简洁、一致的接口。它包含了子系统中的多个模块或组件的

    2024年01月19日
    浏览(68)
  • 设计模式之外观模式笔记

    记录下学习设计模式-外观模式的写法。JDK使用版本为1.8版本。 意图 :为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 结构 : 其中: Facade知道哪些子系统类负责处理请求;将客户的请求代理给适合的子系统

    2024年02月11日
    浏览(36)
  • js设计模式:外观模式

    将复杂的功能封装成可以简单调用的方法,无需知道内部的具体逻辑,只需要知道怎么去使用 类似于一把枪,你可以不知道内部的枪机,击发机,复进簧,枪管,导气装置,弹夹是怎么合作配合完成发射和自动填弹,你只需要知道你扣动扳机就能完成这一系列复杂的操作,而那个扳机就是

    2024年02月22日
    浏览(39)
  • Java设计模式-外观模式

    在软件开发过程中,经常会遇到复杂的系统和庞大的类库。这些系统往往包含了大量的类和子系统,给开发人员带来了挑战。为了简化接口设计和提高系统的可用性,设计模式提供了一种名为外观模式的解决方案。 外观模式是一种结构型设计模式,旨在为复杂系统提供一个简

    2024年02月05日
    浏览(49)
  • Java外观设计模式

    外观模式(Facade Pattern)是一种结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。这种模式属于结构型模式,它向现有的系统添加一个接口,来隐

    2024年02月16日
    浏览(36)
  • 设计模式之代理模式与外观模式

    目录 代理模式 简介 优缺点 角色职责 实现 运用场景 外观模式 简介 角色职责 优缺点 实现 使用场景 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介 优点:  

    2024年02月10日
    浏览(36)
  • 【23种设计模式】外观模式(十)

    外观模式 ,英文名称是: Facade Pattern 。我们先从名字上来理解一下“外观模式”。我看到了“外观”这个词语,就想到了“外表”这个词语,两者有着很相近的意思。就拿谈恋爱来说,“外表”很重要,如果第一眼看着很舒服、有眼缘,那就有交往下去的可能。如果长的“

    2024年02月08日
    浏览(44)
  • C++ 设计模式之外观模式

    【声明】本题目来源于卡码网(题目页面 (kamacoder.com)) 【提示:如果不想看文字介绍,可以直接跳转到C++编码部分】 【简介】什么是外观模式         外观模式 Facade Pattern , 也被称为“⻔⾯模式”,是⼀种 结构型设计模式 ,外观模式定义了⼀个⾼层接⼝,这个接⼝使得

    2024年01月17日
    浏览(41)
  • JavaScript 设计模式之外观模式

    我们为啥要使用外观模式呢,其实我们在使用各种 js 库的时候常常会看到很多的外观者模式,也正是这些库的大量使用,所以使得兼容性更广泛,通过外观者模式来封装多个功能,简化底层操作方法 在我们写方法时,通常会传递参数的形式来传递数据 但是我们更应该这样来

    2024年02月20日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包