zoukankan      html  css  js  c++  java
  • 设计模式之外观模式

    外观模式(门面模式) Facade

    Intro

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

    Prototype

    • Facade: 外观类,知道哪些子系统类负责处理请求,将请求代理给对应的子系统对象
    • SubSystem Classes,实现子系统中的功能,处理 Facade 指派的任务,和 Facade 没有关联关系,没有继承,也不会引用 Facade
    public class SubSystem1
    {
        public void MethodA()
        {
            Console.WriteLine("MethodA in SubSystem1");
        }
    
        public void MethodB()
        {
            Console.WriteLine("MethodB in SubSystem1");
        }
    }
    public class SubSystem2
    {
        public void MethodA()
        {
            Console.WriteLine("MethodA in SubSystem2");
        }
    
        public void MethodB()
        {
            Console.WriteLine("MethodB in SubSystem2");
        }
    }
    public class SubSystem3
    {
        public void MethodA()
        {
            Console.WriteLine("MethodA in SubSystem3");
        }
    
        public void MethodB()
        {
            Console.WriteLine("MethodB in SubSystem3");
        }
    }
    
    public class Facade
    {
        private readonly SubSystem1 _subSystem1 = new SubSystem1();
        private readonly SubSystem2 _subSystem2 = new SubSystem2();
        private readonly SubSystem3 _subSystem3 = new SubSystem3();
    
        public void MethodA()
        {
            _subSystem1.MethodA();
            _subSystem2.MethodA();
            _subSystem3.MethodA();
            Console.WriteLine();
        }
    
        public void MethodB()
        {
            _subSystem1.MethodB();
            _subSystem2.MethodB();
            _subSystem3.MethodB();
            Console.WriteLine();
        }
    }
    
    var facade = new Facade();
    facade.MethodA();
    facade.MethodB();
    

    应用场景

    • 解决易用性问题,可以用来封装系统的底层实现,隐藏系统的复杂性,提供一组更加简单易用、更高层的接口。
    • 解决性能问题,通过将多个接口调用替换为一个门面接口调用,减少网络通信成本,提高 App 客户端的响应速度。API 聚合就是属于这种,也是属于外观模式的应用
    • 解决事务问题,通过门面模式可以方便的使得原本多个操作可以在一个事务内完成,如果中间某一个环节操作失败,可以回滚事务,撤销变更

    More

    接口设计的好坏,直接影响到类、模块、系统是否好用。所以,我们要多花点心思在接口设计上。

    完成接口设计,就相当于完成了一半的开发任务。只要接口设计得好,那代码就差不到哪里去。接口粒度设计得太大,太小都不好。太大会导致接口不可复用,太小会导致接口不易用。

    在实际的开发中,接口的可复用性和易用性需要“微妙”的权衡。针对这个问题,我的一个基本的处理原则是,尽量保持接口的可复用性,但针对特殊情况,允许提供冗余的门面接口,来提供更易用的接口。

    Reference

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    模块在insmod之后无法rmmod问题
    FL2440驱动添加(2): RTC(Real time clock)
    虚拟机安装CentOS6.3两个问题
    内核移植和文件系统制作(3)Ramdisk简介和常见问题
    FL2440驱动添加(1):hello world 驱动模块添加
    内核移植和文件系统制作(2):linux内核最小系统和initramfs文件系统
    内核移植和文件系统制作(1):根文件系统制作总结
    mysql 5.7.16多源复制
    mysql 5.7安装脚本
    二进制方式快速安装MySQL数据库命令集合
  • 原文地址:https://www.cnblogs.com/weihanli/p/facade-pattern.html
Copyright © 2011-2022 走看看