121.00K
Категория: ПрограммированиеПрограммирование

Посредник (англ. Mediator) — поведенческий шаблон проектирования

1.

Посредник (англ. Mediator) — поведенческий
шаблон проектирования, обеспечивающий
взаимодействие множества объектов, формируя
при этом слабую связанность и избавляя объекты
от необходимости явно ссылаться друг на друга.

2.

Проблема
Обеспечить взаимодействие множества объектов,
сформировав при этом слабую связанность и
избавив объекты от необходимости явно
ссылаться друг на друга.

3.

Решение
Создать объект, инкапсулирующий способ
взаимодействия множества объектов.

4.

Преимущества
Устраняется связанность между
"Коллегами", централизуется управление.

5.

6.

#include <iostream>
#include <vector>
using namespace std;
class master;
class senior_slave;
class slave;
class slave_1_type;
class slave_2_type;

7.

class slave
{
protected:
bool lazy;
senior_slave* almoust_master;
public:
bool get_laziest()
{
return lazy;
}
void set_almoust_master(senior_slave* x)
{
almoust_master=x;
}
};
class slave_1_type: public slave
{
public:
slave_1_type()
{
lazy=true;
}
};
class slave_2_type: public slave
{
public:
slave_2_type()
{
lazy=false;
}
};

8.

class senior_slave
{
master*x;
vector<slave*> slaves;
public:
void add_slave(slave* x)
{
slaves.push_back(x);
}
int count_of_not_lazy()
{
int n=0;
for(int i=0;i<slaves.size();i++)
{
if(slaves[i]->get_laziest()==0)n++;
}
return n;
}
void set_master(master*y)
{
x=y;
}
};

9.

class master
{
senior_slave*x;
int count_of_not_lazy_slaves;
public:
void let_me_see_count_of_not_lazy_slaves()
{
count_of_not_lazy_slaves=x->count_of_not_lazy();
}
void boast()
{
cout<<count_of_not_lazy_slaves<<endl;
}
void set_senior_slave(senior_slave*y)
{
x=y;
}
};

10.

int main()
{
slave*z;
senior_slave*y;
master*x;
x=new master();
y=new senior_slave();
x->set_senior_slave(y);
y->set_master(x);
for(int i=0;i<10;i++)
{
z=new slave_1_type();
z->set_almoust_master(y);
y->add_slave(z);
}
for(int i=0;i<8;i++)
{
z=new slave_2_type();
z->set_almoust_master(y);
y->add_slave(z);
}
x->let_me_see_count_of_not_lazy_slaves();
x->boast();
return 0;
}
English     Русский Правила