Шаблон проектирования Bridge


На главную
Содержание


E. Gamma, R. Helm, R. Johnson, J. Vlissides определяют назначение шаблона Bridge следующим образом: шаблон Bridge "отделяет абстракцию от ее реализации так, чтобы они могли изменяться независимо".
При этом часто упрощается иерархия классов, т.к. применение данного шаблона в каком-то смысле выступает в качестве альтернативы наследованию классов.

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

Таким образом, иерархия классов получается довольно сложной, что будет особенно заметно, если потребуется увеличить число предметов или способов сдачи экзамена (например, добавить способ сдачи экзамена в виде теста).

В данном случае полезно использовать шаблон Bridge, суть которого заключается в отделении иерархии объектов от реализации поведения этих объектов. В нашем примере мы должны разделить сами предметы и способы приема экзаменов по этим предметам:
Применение шаблона


Приведем реализацию описанного выше примера:


Реализация на C++
//базовый класс для способов приема экзамена
class TPassExam {
public:
virtual void pass() = 0;
};
//реализация различных способов приема
class TPassExamTalk : public TPassExam {
public:
void pass() {
//...
};
};
class TPassExamWrite : public TPassExam {
public:
void pass() {
//...
};
};
//базовый класс для предметов
class TSubject {
protected:
//аргегация способа приема экзамена
TPassExam* wayToPass;
public:
virtual void passExam() = 0;
};
//конкретные предметы
class TMathematics : public TSubject {
public:
//здесь используется нужный метод pass(),
//который определяется типом переменной
//wayToPass
void passExam() { wayToPass->pass(); };
};
class TPhysics : public TSubject {
public:
void passExam() { wayToPass->pass(); };
};


Реализация на C#
//базовый класс для способов приема экзамена
abstract class TPassExam {
abstract public void pass();
}
//реализация различных способов приема
class TPassExamTalk : TPassExam {
override public void pass() {
//...
}
}
class TPassExamWrite : TPassExam {
override public void pass() {
//...
}
}
//базовый класс для предметов
abstract class TSubject {
//аргегация способа приема экзамена
protected TPassExam wayToPass;
abstract public void passExam();
}
//конкретные предметы
class TMathematics : TSubject {
override public void passExam() {
//здесь используется нужный метод pass(),
//который определяется типом переменной
//wayToPass
wayToPass.pass();
}
}
class TPhysics : TSubject {
override public void passExam() {
wayToPass.pass();
}
}

Содержание
На главную

Rambler's Top100
Хостинг от uCoz