zoukankan      html  css  js  c++  java
  • 非法疫苗引发的思考 -外观模式

    一、前言

    这几天,这则新闻刷爆了各大网络和朋友圈--

    山东警方破获案值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)

  • 相关阅读:
    SpringBoot配置默认日志logback
    SpringBoot静态资源映射、拦截器、过滤器使用
    windows系统安装两个Mysql服务
    SpringBoot使用Jsp开发Web项目
    SpringBoot使用Thymeleaf开发Web项目
    SpringBoot启动原理
    javascript Date
    UDP发送数据测试
    自动迁移
    EF 自测例子
  • 原文地址:https://www.cnblogs.com/yinrq/p/5311410.html
Copyright © 2011-2022 走看看