一、前言
这几天,这则新闻刷爆了各大网络和朋友圈--
山东警方破获案值5.7亿元【非法疫苗】案,疫苗未经严格冷链存储运输销往18个省市。疫苗含25种儿童、成人用二类疫苗。
【非法疫苗】:正规厂家生产,未按照规定进行冷链存储和运输或者快过期的疫苗。
【无效免疫】:起不到免疫作用。
虽然【非法疫苗】不是假冒伪劣疫苗也不是毒疫苗,但是接种后为造成【无效免疫】,就是白接种了。尼玛这也最好的结果,不知道还有什么副作用吧。
这些涉案人员为了挣钱不择手段,失去人性,连祖国的花朵都不去保护,还从花朵周围吸取利益,不道德。
鼓起了那么大的勇气去打疫苗,打完才知道是【非法疫苗】
我们程序员能做的就是写好代码,不出bug,不给家人、同事、社会制造麻烦;积极学习,身上要充满正能量。
时时关注国家大事,多看新闻联播,为祖国的健康快速发展贡献自己的一段代码。
说了这么多非法疫苗的事情,咱们也看看设计模式-外观模式
二、基本概念
外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。
外观模式包括两个角色:
子系统类集合(SubSystem Classes):子系统类集合实现了子系统的功能,处理外观类对象指派的任务。
外观类(Facade):外观类知道哪些子系统类负责处理请求,将客户的请求代理给恰当的子系统对象。
外观模式从很大程度上提高了客户端使用的便捷性,使得客户端无须关心子系统的工作细节,通过外观角色即可调用相关功能。
三、基本代码
基本代码实现:
//子系统角色:A public class SystemA { public void GetDataA() { Console.WriteLine("这是系统A的方法!"); } } //子系统角色:B public class SystemB { public void GetDataB() { Console.WriteLine("这是系统B的方法!"); } } //子系统角色:C public class SystemC { public void GetDataC() { Console.WriteLine("这是系统C的方法!"); } } //外观角色 public class Facade { private SystemA systemA; private SystemB systemB; private SystemC systemC; public Facade() { systemA = new SystemA(); systemB = new SystemB(); systemC = new SystemC(); } //外观方法A public void GetFacadeA() { Console.WriteLine("Method group A----"); systemA.GetDataA(); systemB.GetDataB(); } //外观方法B public void GetFacadeB() { Console.WriteLine(" Method group B----"); systemA.GetDataA(); systemB.GetDataB(); systemC.GetDataC(); } } static void Main(string[] args) { // 由于外观模式的作用,客户端可以根本不知道子系统类的存在 Facade facade = new Facade(); facade.GetFacadeA(); facade.GetFacadeB(); }
运行结果如下:
四、实例代码
非法疫苗代码实例:
//儿童类 public class Children { //名字 public string Name { get; set; } //年龄 public int Age { get; set; } } //疫苗 public class Vaccine { //名称 public string Name { get; set; } //批次(不同的批次,应该是来货的渠道不一样吧,估计就这里有问题了) public string Batch { get; set; } //保质期,过期的疫苗也拿来挣钱,天地不容,人神公愤! public string Guarantee { get; set; } } //去社区卫生服务中心接种疫苗 public class ChildrenData { public void GoToCommunityHealthCentre() { Console.WriteLine("爸妈带儿童去卫生服务中心接种疫苗!"); } } //疫苗进货 public class VaccineData { public void GetVaccine() { Console.WriteLine("关爱祖国的花朵,进合法合格的疫苗,不挣良心钱!"); } } //为客户端提供一个接种接口 public class ChildrenWithVaccine { private ChildrenData childrenData = new ChildrenData(); private VaccineData childrVaccineData = new VaccineData(); //接种疫苗 public void GetVaccine(Children children, Vaccine vaccine) { childrenData.GoToCommunityHealthCentre(); childrVaccineData.GetVaccine(); Console.WriteLine("护士给" + children.Name + "接种" + vaccine .Name+ "!"); } } static void Main(string[] args) { //家长不知道疫苗在哪里进货,只知道到固定的时间带儿子去接种疫苗 ChildrenWithVaccine childrenWithVaccine = new ChildrenWithVaccine(); Children children = new Children() { Name = "小明", Age = 3 }; Vaccine vaccine = new Vaccine() { Name = "流感疫苗", Batch = "20160323", Guarantee = "2019-05-01" }; childrenWithVaccine.GetVaccine(children, vaccine); Console.ReadKey(); }
运行结果如下:
五、总结
优点:
对客户屏蔽子系统组件
实现了子系统与客户之间的松耦合关系
降低了大型软件系统中的编译依赖性
只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
缺点:
不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性
在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
适用环境:
当要为一个复杂子系统提供一个简单接口时可以使用外观模式。该接口可以满足大多数用户的需求,而且用户也可以越过外观类直接访问子系统
客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性
在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度
代码下载:https://yunpan.cn/cYNYsKmL3ySMx (提取码:1ca8)