Erich Gamma Ralph Johnson Richard Helm John Vlissides Addison-Wesley



Download 6,32 Mb.
Pdf ko'rish
bet185/273
Sana02.03.2022
Hajmi6,32 Mb.
#479589
1   ...   181   182   183   184   185   186   187   188   ...   273
Bog'liq
Priemioop

Паттерны поведения
void OpenCommand::Execute () {
const char* name = AskUser();
if (name != 0) {
Document* document = new Document(name);
_application->Add(document);
document->0pen() ;
}
}
Команде PasteCommand в конструкторе передается объект Document, явля-
ющийся получателем:
class PasteCommand : public Command {
public:
PasteCommand(Document*);
virtual void ExecuteO;
private:
Document* „document;
};
PasteCommand::PasteCommand (Document* doc) {
_document = doc;
}
void PasteCommand::Execute () {
_document->Paste();
}
В случае с простыми командами, не допускающими отмены и не требующими
аргументов, можно воспользоваться шаблоном класса для параметризации по-
лучателя. Определим для них шаблонный подкласс SimpleCoiranand, который па-
раметризуется типом получателя Receiver и хранит связь между объектом-полу-
чателем и действием, представленным указателем на функцию-член:
template 
class SimpleCoiranand : public Command {
public:
typedef void (Receiver::* Action)();
SimpleCommand(Receiver* r, Action a) :
_receiver(r), _action(a) { }
virtual void ExecuteO;
private:
Action _action;
Receiver* _receiver;
};
Конструктор сохраняет информацию о получателе и действии в соответству-
ющих переменных экземпляра. Операция Execute просто выполняет действие
по отношению к получателю:
template 
void SimpleCommand::Execute () {
(_receiver->*_action)();
}


Паттерн Command
Чтобы создать команду, которая вызывает операцию Action для экземпляра
класса MyClass, клиент пишет следующий код:
MyClass* receiver = new MyClass;
// ...
Command* aCommand =
new SimpleCommand(receiver, &MyClass::Action);
/ / . . .
aCommand->Execute();
Имейте в виду, что такое решение годится только для простых команд. Для
более сложных команд, которые отслеживают не только получателей, но и аргу-
менты и, возможно, состояние, необходимое для отмены операции, приходится
порождать подклассы от класса Command.
Класс Macr©Command управляет выполнением последовательности подко-
манд и предоставляет операции для добавления и удаления подкоманд. Задавать
получателя не требуется, так как в каждой подкоманде уже определен свой полу-
чатель:
class MacroCommand : public Command {
public:
MacroCommand();
virtual -MacroCommand();
virtual void Add(Command*);
virtual void Remove(Command*);
virtual void Execute();
private:
List* _cmds;
};
Основой класса MacroCommand является его функция-член Execute. Она об-
ходит все подкоманды и для каждой вызывает ее операцию Execute:
void MacroCommand::Execute () {
ListIterator i(_cmds);
for (i. First { ) ; !i.IsDone(); i . N e x t O ) {
Command* с = i.Currentltem();
c->Execute();
}
}
Обратите внимание, что если бы в классе MacroCommand была реализована
операция отмены Unexecute, то при ее выполнении подкоманды должны были
бы отменяться в порядке,
 обратном
тому, который применяется в реализации
Execute.
Наконец, в классе MacroCommand должны быть операции для добавления и уда-
ления подкоманд:
void MacroCommand::Add (Command* с) {
_cmds->Append(c) ;
}



Download 6,32 Mb.

Do'stlaringiz bilan baham:
1   ...   181   182   183   184   185   186   187   188   ...   273




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish