zoukankan      html  css  js  c++  java
  • 设计模式11——结构型模式之外观模式

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

    类型:结构型模式。

    适用性:

    1. 当子系统非常复杂时,使得客户调用非常麻烦,不便于使用。这个时候就可以使用外观模式将这些子系统封装起来,提供一个统一而简单接口供客户端使用。
    1. 当需要构建一个层次结构的子系统时,使用外观模式可以给子系统定义进入口。

    概述:

              外观模式主要依赖“迪米特法则”,即尽量减少与其他实体之间的联系。例如,用户和一台电脑。如果用户想开机,他不需要云单独打开电源,再启动CPU,再启动硬盘电源,再连接显示器。用户不需要知道电脑开机完成了哪些工作,用户只想开机了就可以正常使用电脑就行了。用户要做的,只是按一下开机键,所有的一切都会在这一个开机动作中自动完成。减少用户对电脑内部的了解,这样能够使得用户更方便地使用电脑,而且如果电脑开机有问题,也不需要云从用户身上找,直接去电脑上面找就可以,能够更方便地定位问题。

    类图:

    参与者:

    1. Client,客户端,直接与Computer交互。
    1. Computer,由DisplayPowerHardDisk几个子系统构成。并且提供一个Startup的接口用来一次性控制所有子系统启动。
    2. DisplayPowerHardDisk,子系统,完成Computer指派的功能。

    示例代码:

    // C#
    namespace Design11
    {
        class Power
        {
            public void Start()
            {
                Console.WriteLine("");
            }
        }
     
        class Display
        {
            public void DisplayContent()
            {
                Console.WriteLine("");
            }
        }
     
        class HardDisk
        {
            public void ReadDisk()
            {
                Console.WriteLine("");
            }
        }
     
        // Fasade
        class Computer
        {
            private Power power = new Power();
            private Display display = new Display();
            private HardDisk hDisk = new HardDisk();
     
            public void Startup()
            {
                power.Start();
                display.DisplayContent();
                hDisk.ReadDisk();
            }
        }
     
        // Client
        class Program
        {
            static void Main(string[] args)
            {
                Computer computer = new Computer();
     
                Console.WriteLine("");
                computer.Startup();
            }
        }
    }
     
     

    优点:使得代码更加模块化,更方便调用以及查找问题。

    注意:如果有多个子系统需要进行通讯时,最好是通过Facade来中转。

    参考资料:

    1. 《设计模式——可复用面向对象软件基础》
    1. 《大话设计模式》
    1. 《Head First设计模式》
  • 相关阅读:
    克罗内克符号
    子进程和线程
    力扣:数学问题
    iconv装换文件编码格式
    mac 上iterm终端显示中文为乱码解决方案
    Android启动时间测试方法
    Centos4.3安装MySQL-python-1.2.3,出现error: command 'gcc' failed with exit status 1
    java mail发送邮件
    Java通过socket实现smtp协议发送邮件
    vim解决中文显示乱码问题
  • 原文地址:https://www.cnblogs.com/feihe0755/p/3526113.html
Copyright © 2011-2022 走看看