设计模式-外观模式与组合模式

1. 外观模式

        顾名思义,外观模式就是说将这个类的内部执行流程都进行了封装,程序员只能够“外部”接口进行操作,而具体的执行过程并不可见。比如我们写的C++代码在生成可执行文件的过程之通常要经过预处理、编译、汇编与链接四个步骤,但是在windows的VSCode编译器下我们并不需要操心以上四个流程,我们只需要点击运行就能够得到可执行程序。因此,在VSCode类中,只需要在公共接口中依次进行上述四个步骤即可对现有代码进行运行。

        下面就是整个流程代码:

#include <iostream>

using namespace std;

class Preprocessing{
public:
    void show(){
        cout << "这是预处理" << endl;
    }    
};

class Compiler{
public:
    void show(){
        cout << "这是编译器" << endl;
    }    
};

class Assembler{
public:
    void show(){
        cout << "这是汇编" << endl;
    }    
};

class Linker{
public:
    void show(){
        cout << "这是链接" << endl;
    }    
};

class VSCode{
public:
    void run(){
        Preprocessing* pre = new Preprocessing();
        Compiler* com = new Compiler();
        Assembler* ass = new Assembler();
        Linker* lin = new Linker();
        pre->show();
        com->show();
        ass->show();
        lin->show();
    }
};

int main(){
    VSCode* vscode = new VSCode();
    vscode->run();
    return 0;
}

        下面就是运行结果:

 2. 组合模式

         组合模式的出现是为了处理树状的关系组织,比如学校各个部门与学校的关系、公司各个部门与公司的关系,这都可以看做是一个树状结构,而组合模式就可以很好的处理这些关系。借用二叉树中的概念,公司就可以看做是一个根节点,而下面的部分就可以看做是一个子节点,它们都有一个功能的基类,就是节点类。

2.1 根节点类

        在根节点类(Department)中,主要使用list容器存储其下属的所有部分。

#include <iostream>
#include <list>

using namespace std;

class Department{
protected:
    list<Department*> container;
public:
    Department(){};
    virtual ~Department(){};
    virtual void attach(Department* department){
        container.push_back(department);
    }
    virtual void show() = 0;
    virtual void info(){
        for(list<Department*>::iterator it = container.begin(); it != container.end(); ++it){
            (*it)->show();
        }
    }
};

2.2 其他子节点的实现

        在其他子节点中,所写的方法也加上virtual,这是因为当前的子节点可能会作为其他子节点的根节点,所以说为了继承,每个子节点的成员函数都需要加上virtual关键字

class School:public Department{
public:
    virtual void show(){
        cout << "这里是学校" << endl;
    }
};

class CSSchool:public Department{
public:
    virtual void show(){
        cout << "这里是计算机学院" << endl;
    }
};

class ICSchool:public Department{
public:
    virtual void show(){
        cout << "这里是信控学院" << endl;
    }
};

2.3 主函数测试结果

        下面就是测试代码以及测试结果:

int main(){
    School* school = new School();
    CSSchool* cs = new CSSchool();
    ICSchool* ic = new ICSchool();
    school->attach(cs);
    school->attach(ic);
    school->info();
    return 0;
}

        

3. 参考文献

(1)  设计模式C++实现(7)——外观模式、组合模式_wuzhekai1985的博客-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值