zoukankan      html  css  js  c++  java
  • Facade——外观模式

      Facade外观模式,也是比较常用的一种模式,基本上所有软件系统中都会用到。 GOF 在《设计模式》一书中给出如下定义:为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。简单说,就是将复杂的逻辑封装起来,对外公开简单的接口,由客户程序调用。客户对象通过一个外观接口读写子系统中各接口的数据资源。

    适用情景

    (1)设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。

    (2)开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。

    (3)维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。

    优点:

    (1)降低了子系统与客户端之间的耦合关系。

    (2)客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。

    外观模式类图:

    下面我们来实现一个外观模式案例:

    根据类图实现家庭影院外观模式应用;

    (1).实现KTV模式:电视on,灯off,音响on,DVD off。

    (2).实现游戏模式:电视on,音响on,游戏机on。

    类图:

    实现代码:

    #include<iostream>
    using namespace std;
    
    class TV 
    {
    public:
        void on() { cout << "TV打开" << endl; }
        void off() { cout << "TV关闭" << endl; }
    };
    
    class XBox
    {
    public:
        void on() { cout << "XBox打开" << endl; }
        void off() { cout << "XBox关闭" << endl; }
    };
    
    class Light
    {
    public:
        void on() { cout << "Light打开" << endl; }
        void off() { cout << "Light关闭" << endl; }
    };
    
    class DVD
    {
    public:
        void on() { cout << "DVD打开" << endl; }
        void off() { cout << "DVD关闭" << endl; }
    };
    
    class MikePhone
    {
    public:
        void on() { cout << "MikePhone打开" << endl; }
        void off() { cout << "MikePhone关闭" << endl; }
    };
    
    class HomePlayer
    {
    public:
        void KTVMode()
        {
            tv.on();
            light.off();
            mike.on();
            dvd.on();
        }
        void GameMode()
        {
            tv.on();
            mike.on();
            xbox.on();
        }
    private:
        TV tv;
        DVD dvd;
        MikePhone mike;
        Light light;
        XBox xbox;    
    };
    
    int main(void)
    {
        HomePlayer hp;
        cout << "进入KTV模式" << endl;
        hp.KTVMode();
        cout << "进入Game模式" << endl;
        hp.GameMode();
        return 0;
    }

    运行结果:

  • 相关阅读:
    LeetCode 977 有序数组的平方
    LeetCode 24 两两交换链表中的节点
    LeetCode 416 分割等和子集
    LeetCode 142 环形链表II
    LeetCode 106 从中序与后序遍历序列构造二叉树
    LeetCode 637 二叉树的层平均值
    LeetCode 117 填充每个节点的下一个右侧节点
    LeetCode 75 颜色分类
    redhat 7.4 挂载ntfs格式的u盘并且使用
    redhat 查看CPU frequency scaling(CPU频率缩放)
  • 原文地址:https://www.cnblogs.com/Burgess-Fan/p/6783569.html
Copyright © 2011-2022 走看看