🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。
毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。每种设计模式都有相应的原理和最佳实践,它们描述了我们日常开发中不断遇到的问题,以及这些问题的核心解决方法。正是因为这种实用性和通用性,设计模式才能在软件开发中广泛地得以应用。设计模式是构建稳健、可扩展和可维护软件的关键工具,为开发者们提供了解决问题的智慧和指导。
外观模式属于结构型设计模式,其主要目的是隐藏系统内部的复杂性,为客户端提供一个简化的接口,使客户端能够更容易地访问系统。
外观模式提供了一个统一的接口,该接口整合了子系统中一组接口,使子系统更易于访问和使用。这种模式使客户端不必了解子系统的详细实现,而只需与外观接口交互,从而降低了客户端与系统之间的耦合度。外观模式通常用于简化复杂系统的操作,提高代码的可维护性和可读性。
外观模式(Facade Pattern)中的外观角色(Facade)是该模式的关键组成部分,具有重要的概念和作用:
外观角色的存在使得客户端的代码更加简洁和易读,同时提供了一种有效的方式来管理复杂系统的复杂性。这在大型软件项目中特别有用,可以帮助团队更好地组织和维护代码。
外观模式(Facade Pattern)中的子系统角色(SubSystem)是指组成整个系统的各个组件、类或模块。这些子系统角色是外观模式的一部分,具有以下概念和作用:
子系统角色在外观模式中扮演着实际执行系统功能的角色,它们的存在有助于将系统内部的复杂性隐藏起来,同时提供了一个简化的接口供外观角色和客户端使用。这种模式有助于提高系统的可维护性、可扩展性和可理解性,特别是在大型软件项目中。
命名空间FacadePattern中包含外观类Facade,提供公开的Handle方法,Haikwan是海关类,可以通过Apply方法从后台取得一个加密的完税凭证JSON数据,Decrypt类为解密类,可以解密海关的JSON数据,TaxProof则是完税凭证类,可以将JSON反序列化成一个对象,FileStore则将完税凭证数据持久化到文件中。本案例尝试通过一个从海关获取数据、解密、反序列化、保存到文件的完整流程来向大家简明扼要的阐述外观模式的使用。
public class Haikwan {
public string Apply(Uri uri) {
Console.WriteLine($"Apply some data from {uri.ToString()}!");
return Const.TEMPLET_HAIKWAN;
}
}
海关类Haikwan,包含一个Apply方法可以从海关的后台获取一个加密的JSON数据。
public class Decrypt {
public string Decipher(string ciphertext) {
Console.WriteLine("Deciphering ciphertext!");
Console.WriteLine(Const.LINE_BREAK);
Console.WriteLine(ciphertext);
Console.WriteLine(Const.LINE_BREAK);
return ciphertext;
}
}
解密类Decrypt,将加密的JSON数据用Decipher方法解密成原始JSON数据。
public class TaxProof {
public string TaxNo { get; private set; }
public decimal Money { get; private set; }
public DateTime PaymentData { get; private set; }
public void Deserialize(string plaintext) {
Console.WriteLine("Creating TaxProof Instance from plaintext!");
TaxNo = "287361039374492-A01";
Money = 1986.1020m;
PaymentData = new DateTime(2018, 07, 20);
}
}
TaxProof完税凭证类,将JSON数据反序列化成实体对象,以便使用类的面向对象语言的优势进行后续的处理。
本例中没有真正实现反序列化的动作,仅仅作为一个演示使用了Hard Code。在实际开发过程中,推荐使用Newtonsoft.Json来处理序列化和反序列化。
public class FileStore
{
public void Store(TaxProof taxProof)
{
Console.WriteLine("Saving taxProof instance to file!");
Console.WriteLine($"TaxProof.TasNo={taxProof.TasNo},");
Console.WriteLine($"TaxProof.TasNo={taxProof.TasNo},");
Console.WriteLine($"TaxProof.TasNo={taxProof.TasNo},");
Console.WriteLine($"TaxProof.TasNo={taxProof.TasNo},");
}
}
FileStore文件保存类,将完税凭证数据持久化到文件中。
public class Facade {
private Haikwan _haikwan = null;
private Decrypt _decrypt = null;
private TaxProof _taxProof = null;
private FileStore _fileStore = null;
public Facade() {
_haikwan = new Haikwan();
_decrypt = new Decrypt();
_taxProof = new TaxProof();
_fileStore = new FileStore();
}
public void Handle(Uri uri) {
var ciphertext = _haikwan.Apply(uri);
var plaintext = _decrypt.Decipher(ciphertext);
_taxProof.Deserialize(plaintext);
_fileStore.Store(_taxProof);
}
}
Facade外观类,这是外观模式的核心类,首先在内部维持对海关类Haikwan、解密类Decrypt、完税凭证类TaxProof、文件保存类FileStore的引用,并在构造函数中创建它们,公开的Handle方法处理一个完整的从海关获取数据到持久化文件的完整流程。
public class Const {
public const string TEMPLET_HAIKWAN = "{\r\n" +
" \"Haikwan\": {\r\n" +
" \"TaxNo\": \"287361039374492-A01\",\r\n" +
" \"Money\": 1986.1020,\r\n" +
" \"PaymentData\": \"\\/Date(1532099596)\\/\"\r\n" +
" }\r\n" +
"}";
public const string LINE_BREAK =
"-------------------------------------------------------------";
public const string HAIKWAN_URI =
"http://@copyright#www.customs.gov.cn";
}
Const常量类,统一管理本案例中用到的字符串资源。实际开发过程中不应当出现此类,请参考2017年阿里发布的《阿里巴巴Java开发手册》,此规则对C#开发者来说也应当遵守。
public class Program {
private static Facade _facade = null;
public static void Main(string[] args) {
_facade = new Facade();
_facade.Handle(new Uri(Const.HAIKWAN_URI));
Console.ReadKey();
}
}
调用方的代码,仅仅需要一行代码就完成了一个完整的流程。以下是这个案例的输出结果:
Apply some data from http://@copyright/#www.customs.gov.cn!
Deciphering ciphertext!
-------------------------------------------------------------
{
"Haikwan": {
"TaxNo": "287361039374492-A01",
"Money": 1986.1020,
"PaymentData": "\/Date(1532099596)\/"
}
}
-------------------------------------------------------------
Creating TaxProof Instance from plaintext!
Saving taxProof instance to file!
TaxProof.TaxNo = 287361039374492-A01,
TaxProof.Money = 1986.1020,
TaxProof.PaymentData = 2018-07-20 00:00:00!
-------------------------------------------------------------
外观模式(Facade Pattern)有许多优点,这些优点使它成为一种有用的设计模式,特别适用于管理复杂系统。以下是外观模式的一些主要优点:
外观模式是一种有效的设计模式,用于简化复杂系统的操作和管理,提高代码的可维护性和可读性,降低了系统的耦合度,使系统更加灵活和易于扩展。
外观模式(Facade Pattern)虽然有许多优点,但也有一些缺点和限制,需要考虑和权衡:
外观模式是一种有用的设计模式,但在使用时需要权衡其优点和缺点,确保它适合特定的应用场景。它最适合于需要简化复杂系统接口、降低耦合度和提高可维护性的情
外观模式(Facade Pattern)在以下情况下特别有用,适合被应用:
外观模式适用于需要简化、组织和管理复杂系统的情况,以及需要降低客户端与系统内部组件之间耦合度的情况。它有助于提高代码的可维护性、可读性和可扩展性,使系统更容易理解和维护。