中介者模式

本文介绍了一种用于降低软件系统中对象之间耦合度的设计模式——中介者模式。通过使用中介者对象来封装一系列对象间的交互,使各对象能更独立地运作。文中详细解释了中介者模式的结构、使用场景及优缺点,并提供了C++代码示例。
意图

用中介者对象封装一系列对象的交互,从而降低其他对象的耦合度,提高其他对象的复合性

结构图

这里写图片描述

使用场景
  1. 一组对象相互之间有复杂的通信方式
  2. 一个对象与其他的很多对象进行关联并且直接进行相互之间的通信
  3. 一个行为的实现需要其它多个类型的多个对象共同完成,但有不愿生成过多的子类
优点
  1. 减少子类生成,控制集体化。将对象之间的控制都集中在中介者对象中,只需派生中介者类就可以改变通信方式
  2. 将除了中介者对象之外的对象都解耦了
缺点
  1. 牺牲中介者类来提高其他类的复用性
实现
  1. 中介者模式的退化:如果中介者类以后不会发生变化,只有一个中介者类与替他类进行交互时,不需要抽象的中介者类。
  2. 中介者模式可以和其他模式一起使用比如:观察者模式

代码:

//
//  DialogDirector.h
//  textD
//
//  Created by md101 on 15/10/20.
//  Copyright © 2015年 md101. All rights reserved.
//

#ifndef DialogDirector_h
#define DialogDirector_h

#include <iostream>
#include <vector>
using namespace std;
class Widget;

/*抽象Mediator基类*/
class DialogDirector
{
public:
    virtual ~DialogDirector();

    virtual void showDialog(){}
    virtual void widgetChanged(Widget *) = 0;
    /*往中介者类中添加同事类*/
    void addWidget(Widget *widget);
protected:
    DialogDirector(){}
    vector<Widget* > component;
};
#endif /* DialogDirector_h */

//
//  DialogDirector.cpp
//  textD
//
//  Created by md101 on 15/10/20.
//  Copyright © 2015年 md101. All rights reserved.
//

#include "DialogDirector.h"
#include "Widget.h"

void DialogDirector::addWidget(Widget *widget)
{
    component.push_back(widget);
    widget->setDialogDirector(this);
}

DialogDirector::~DialogDirector()
{
    std::cout<<"sdgag";
    for(vector<Widget*>::iterator iter = component.begin(); iter != component.end(); ++iter){
        delete (*iter);
    }
}
//
//  Widget.h
//  textD
//
//  Created by md101 on 15/10/20.
//  Copyright © 2015年 md101. All rights reserved.
//

#ifndef Widget_h
#define Widget_h

#include <iostream>
#include "DialogDirector.h"

/*组件接口*/
class Widget
{
public:
    Widget(){}
    /*Widget(DialogDirector *dir){ this->director = dir; }
    组件通过此函数调用中介者函数进行通信的转播*/
    virtual void changed(){ director->widgetChanged(this); }

    void setDialogDirector(DialogDirector *dia){
        director = dia;
    }
    virtual ~Widget(){}
private:
    DialogDirector* director;
};
#endif /* Widget_h */

//
//  Widget.cpp
//  textD
//
//  Created by md101 on 15/10/20.
//  Copyright © 2015年 md101. All rights reserved.
//

#include "Widget.h"
//
//  ListBox.h
//  textD
//
//  Created by md101 on 15/10/21.
//  Copyright © 2015年 md101. All rights reserved.
//

#ifndef ListBox_h
#define ListBox_h

#include <iostream>
#include "Widget.h"

class ListBox:public Widget
{
public:
    ListBox(DialogDirector *dir);
    ListBox(){}
    ~ListBox(){ std::cout<<"ListBox析构"<<endl;}


};


#endif /* ListBox_h */

//
//  ListBox.cpp
//  textD
//
//  Created by md101 on 15/10/21.
//  Copyright © 2015年 md101. All rights reserved.
//

#include "ListBox.h"
//
//  EntryField.
//  textD
//
//  Created by md101 on 15/10/21.
//  Copyright © 2015年 md101. All rights reserved.
//

#ifndef EntryField_h
#define EntryField_h

#include <iostream>
#include "Widget.h"

class EntryField:public Widget
{
public:
    EntryField( DialogDirector *dir);
    EntryField(){}
    ~EntryField(){ std::cout<<"EntryField析构"<<endl;}
};
#endif /* EntryField_h */

//
//  EntryField.cpp
//  textD
//
//  Created by md101 on 15/10/21.
//  Copyright © 2015年 md101. All rights reserved.
//

#include "EntryField.h"
//
//  FontDialogDirector.h
//  textD
//
//  Created by md101 on 15/10/21.
//  Copyright © 2015年 md101. All rights reserved.
//

#ifndef FontDialogDirector_h
#define FontDialogDirector_h

#include <iostream>
#include "DialogDirector.h"
#include "ListBox.h"
#include "EntryField.h"


class FontDialogDirector:public DialogDirector
{
public:
    FontDialogDirector(){}
    virtual ~FontDialogDirector(){std::cout<<"sdfs";}
    /*通过传入一个指针进行判断从而实现各组件之间的协同工作,该函数中包含了具体的哪个对象同哪个对象的通信的细节*/
    virtual void widgetChanged(Widget *theWorkWidget);

protected:
    /*创建组件,中介者对象与同事对象实现相互绑定
    virtual void creatWidgets();*/

};

#endif /* FontDialogDirector_h */

//
//  FontDialogDirector.cpp
//  textD
//
//  Created by md101 on 15/10/21.
//  Copyright © 2015年 md101. All rights reserved.
//

#include "FontDialogDirector.h"
using namespace std;

void FontDialogDirector::widgetChanged(Widget *theWorkWidget)
{
    for(vector<Widget*>::iterator iter = component.begin(); iter != component.end(); ++iter){
        if (theWorkWidget == *iter) {
            cout<<"EntryField与其他的对象通信的细节"<<endl;
        }else if(theWorkWidget == *iter){
            cout<<"boxg与其他的对象通信的细节"<<endl;
        }
    }

}
/*
void FontDialogDirector::creatWidgets()
{
    field = new EntryField(this);
    box = new ListBox(this);
}
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值