SlideShare a Scribd company logo
1 of 32
Объектно-Ориентированный Дизайн
- Архитектурные паттерны
- MVC
- MVP
- PURE-MVC
- Паттерны проектирования
- Порождающие паттерны (создание новых объектов)
- Структурные паттерны (компоновка системы на основе классов)
- Паттерны поведения (связях между объектами и распределением обязанностей)
- Идиомы
- Pimpl
- Shared Pointer
абстрактная фабрика
Порождающий паттерн
Назначение:
Система должна оставаться независимой как
от процесса создания новых объектов, так и от
типов порождаемых объектов.
Задача 1
class Footman
{
public:
Footman ();
virtual ~Footman() {}
};
class Archer
{
public:
Archer ();
virtual ~Archer() {}
};
class HumanFootman: public Footman
{
public:
…
};
class HumanArcher: public Archer
{
public:
…
};
class OrcFootman: public Footman
{
public:
…
};
class OrcArcher: public Archer
{
public:
…
};
Конкретные
классы боевых единиц
Абстрактные классы
боевых единиц
class ArmyFactory
{
protected:
vector<Footman*> m_footmanContainer;
vector<Archer*> m_archerContainer;
public:
virtual void AddFootman() = 0;
virtual void AddArcher() = 0;
};
class HumanArmyFactory: public ArmyFactory
{
public:
void AddFootman()
{
m_footmanContainer.insert(new
HumanFootman);
}
void AddArcher()
{
m_archerContainer.insert(new HumanArcher);
}
};
class OrcArmyFactory: public ArmyFactory
{
public:
void AddFootman()
{
m_footmanContainer.insert(new OrcFootman);
}
void AddArcher()
{
m_archerContainer.insert(new OrcArcher);
}
};
Абстрактная фабрика Конкретные фабрики
class Barracks
{
public:
void Init(ArmyFactory factory) = 0;
void CreateFootman();
void CreateArcher();
};
class Reinforcement
{
public:
void Init(ArmyFactory factory) = 0;
void CreateFootman();
void CreateArcher();
};
Классы, использующие
абстрактную фабрику
В связи с изменениями игрового
баланса, пехотинцы расы людей
должны создаваться по две штуки
за раз!
Где вы были в январе ???
class HumanArmyFactory: public ArmyFactory
{
public:
void AddFootman()
{
m_footmanContainer.insert(new HumanFootman);
m_footmanContainer.insert(new HumanFootman);
}
void AddArcher()
{
m_archerContainer.insert(new HumanArcher);
}
};
Я сделал подсчет и решил, что
изменения должны затронуть
только строение «Барак».
Где вы были в январе ???
class HumanArmyFactoryExtended: public HumanArmyFactory
{
public:
void AddFootman()
{
HumanArmyFactory::AddFootman();
m_footmanContainer.insert(new HumanFootman);
}
void AddArcher()
{
m_archerContainer.insert(new HumanArcher);
}
};
Стратегия
Паттерн поведения
Назначение:
Существуют системы, поведение которых может
определяться согласно одному алгоритму из некоторого
семейства. Все алгоритмы этого семейства являются
родственными: предназначены для решения общих
задач, имеют одинаковый интерфейс для использования
и отличаются только реализацией.
Задача
void Execute(enum E_operation operation)
{
switch(operation)
{
case init_gaia:
…
Break;
Case janus_autorize:
Break;
Case osiris_get_friends:
Break;
}
}
void OnGaiaInit(…)
{
Execute(janus_autorize);
}
Void OnJanusAutorize(…)
{
Execute(osiris_get_friends);
}
Void OnOsirisGetFriends(…)
{
…
}
Решение на «скорую руку»
Class FederationOperation()
{
public:
E_STATUS GetStatus();
virtual void Execute();
virtual void OnResponce();
}
Class FedearionOperationGaiaInit : public FederationOperation
{
void Init(…args);
void Execute();
void OnResponce();
}
Class FedearionOperationJanusAutorize : public FederationOperation
{
void Init(…args);
void Execute();
void OnResponce();
}
Class FedearionOperationOsirisGetFriends: public FederationOperation
{
void Init(…args);
void Execute();
void OnResponce();
}
Решение с использованием паттерна «стратегия»
void Login(…args)
{
m_operations.push(new FedearionOperationGaiaInit );
m_operations.push(new FedearionOperationJanusAutorize );
m_operations.push(new FedearionOperationOsirisGetFriends);
}
void Update()
{
if(!m_operations.clear())
{
FederationOperation* operation = m_operations.front();
if(opeartion->GetStatus() == E_STATUS_UNKNOWN)
{
operation.execute();
}
if(operation->GetStatus() == E_STATUS_SUCCESSED || operation->GetStatus() ==
E_STATUS_FAILURE)
{
m_operations.pop();
}
}
}
Строитель
Порождающий паттерн
Назначение:
Паттерн Строитель отделяет алгоритм поэтапного
конструирования сложного продукта (объекта) от
его внешнего представления так, что с помощью
одного и того же алгоритма можно получать разные
представления этого продукта.
Задача
А запили ты нам систему, по
которой из ресурсов будут
собираться игровые объекты.
Class WoodRequest
{
public:
void Create();
};
Class SteelRequest
{
public:
void Create();
};
Class CoalRequest
{
public:
void Create();
};
Class GrainRequest
{
public:
void Create();
};
class GameObject
{
public:
vector<WoodRequest> m_wood;
vector<SteelRequest> m_steel;
vector<CoalRequest> m_coal;
vector<GrainRequest> m_grain;
void Create();
};
class GameObjectBuilder
{
protected:
GameObject* m_gameObject;
void RequestWood() { m_wood.insert(new WoodRequest);}
void RequestSteel () { m_steel.insert(new SteelRequest);}
void RequestCoal() { m_coal.insert(new CoalRequest();}
void RequestGrain() {m_grain.insert(new GrainRequest(); }
public:
virtual void CreateGameObject();
virtual GameObject* GetGameObject() { return m_gameObject; }
};
class Armory: public GameObjectBuilder
{
public:
void CreateGameObject()
{
m_gameObject = new GameObject();
RequestWood();
RequestSteel();
RequestCoal();
}
};
class Bread: public GameObjectBuilder
{
public:
void CreateGameObject ()
{
m_gameObject = new GameObject();
RequestGrain();
RequestCoal();
}
};
Команда
Паттерн поведения
Назначение:
Система управляется событиями. При появлении такого
события (запроса) необходимо выполнить определенную
последовательность действий.
Задача
Хочу «мишкой» клацать, а «MCV»
пускай перемещается, строит,
атакует и чинит.
Class Unit
{
public:
void move( …args) ;
void attack(…args);
void build(…args) ;
void repair(…args) ;
};
class Command
{
public:
virtual void execute(…args) = 0;
protected:
Command( Unit* unit);
Unit* m_unit;
};
class MoveCommand: public Command
{
public:
MoveCommand( Unit * unit) : Command(unit) {}
void execute(…args)
{
m_unit->move(…args );
}
};
class AttackCommand: public Command
{
public:
AttackCommand( Unit * unit) : Command(unit) {}
void execute(…args)
{
m_unit->attack(…args );
}
};
class BuildCommand: public Command
{
public:
BuildCommand( Unit * unit) : Command(unit) {}
void execute(…args)
{
m_unit->build(…args );
}
};
class RepairCommand: public Command
{
public:
RepairCommand( Unit * unit) : Command(unit) {}
void execute(…args)
{
m_unit->repair(…args );
}
};
А теперь по моему приказу пускай
все сделает наоборот.
class Memento
{
public:
Memento(…args)
{
m_state = …args;
};
private:
friend class Unit;
ARGS* m_state;
};
class Command
{
public:
virtual void execute(…args) = 0;
virtual void undo()
{
m_unit ->RestoreFromMemento(m_memento);
}
Command( Unit* unit)
{
m_unit = unit;
m_memento = m_unit->CreateMemento();
};
Unit* m_unit;
Memento* m_memento;
};
Class Unit
{
private:
Memento* CreateMemento();
void RestoreFromMemento(Memento* memento);
public:
void move( …args) ;
void attack(…args);
void build(…args) ;
void repair(…args) ;
};
Компоновщик
Структурный паттерн
Назначение:
Необходимо объединять группы схожих объектов и
управлять ими.
Задача
Хочу управлять сразу всеми
войсками!
class Unit
{
public:
virtual int GetStrength() = 0;
virtual int GetSpeed() = 0;
virtual void AddUnit(Unit* unit)
{
assert( false);
};
};
class Archer: public Unit
{
public:
virtual int GetStrength()
{
return 3;
};
virtual int GetSpeed()
{
return 1;
};
};
class Footman: public Unit
{
public:
int GetStrength()
{
return 2;
};
int GetSpeed()
{
return 2;
};
};
class Horseman: public Unit
{
public:
int GetStrength()
{
return 1;
};
int GetSpeed()
{
return 3;
};
};
class Legion: public Unit
{
public:
int GetStrength()
{
…
};
int GetSpeed()
{
…
};
void AddUnit(Unit* unit)
{
m_units.push_back( unit);
};
private:
std::vector<Unit*> m_units;
};
А сюда я вставлю свои cбалансированные
формулы.
Одиночка
Порождающий паттерн
Использование протестированного кода вновь и вновь
Разработка с точки зрения абстракции а не реализации
Разделение целостной системы на слои (подсистемы)
Выводы
Стремление инкапсулировать все, что может быть подвержено
инкапсуляции
Основная идея
Побудить желание к написанию структурированного,
грамотного и многоразово-используемого кода

More Related Content

What's hot

Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3Technopark
 
C++ осень 2012 лекция 3
C++ осень 2012 лекция 3C++ осень 2012 лекция 3
C++ осень 2012 лекция 3Technopark
 
Лекция 10. Классы 2.
Лекция 10. Классы 2.Лекция 10. Классы 2.
Лекция 10. Классы 2.Roman Brovko
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8chashnikov
 
Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Ontico
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collectionsMERA_school
 

What's hot (10)

Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
C++ осень 2012 лекция 3
C++ осень 2012 лекция 3C++ осень 2012 лекция 3
C++ осень 2012 лекция 3
 
Лекция 10. Классы 2.
Лекция 10. Классы 2.Лекция 10. Классы 2.
Лекция 10. Классы 2.
 
JRebel
JRebelJRebel
JRebel
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Lambdas in java 8
Lambdas in java 8Lambdas in java 8
Lambdas in java 8
 
Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Bytecode
BytecodeBytecode
Bytecode
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
 

Similar to Odd

Кирилл Харьков
Кирилл ХарьковКирилл Харьков
Кирилл ХарьковCodeFest
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.Igor Shkulipa
 
Архитектура минимальных Ui компонент
Архитектура минимальных Ui компонентАрхитектура минимальных Ui компонент
Архитектура минимальных Ui компонентLerika
 
Java весна 2013 лекция 4
Java весна 2013 лекция 4Java весна 2013 лекция 4
Java весна 2013 лекция 4Technopark
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)AvitoTech
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Sigma Software
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationAndrii Dzynia
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуAndreyGeonya
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DAndreyGeonya
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Android - 01 - Java Basics
Android - 01 - Java BasicsAndroid - 01 - Java Basics
Android - 01 - Java BasicsNoveo
 
Технологии тестирования Rich Web client, Андрей Плешков, Форум Технологий Mai...
Технологии тестирования Rich Web client, Андрей Плешков, Форум Технологий Mai...Технологии тестирования Rich Web client, Андрей Плешков, Форум Технологий Mai...
Технологии тестирования Rich Web client, Андрей Плешков, Форум Технологий Mai...tfmailru
 

Similar to Odd (20)

Кирилл Харьков
Кирилл ХарьковКирилл Харьков
Кирилл Харьков
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.
 
Архитектура минимальных Ui компонент
Архитектура минимальных Ui компонентАрхитектура минимальных Ui компонент
Архитектура минимальных Ui компонент
 
Java весна 2013 лекция 4
Java весна 2013 лекция 4Java весна 2013 лекция 4
Java весна 2013 лекция 4
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногу
 
Lec 14
Lec 14Lec 14
Lec 14
 
Thread
ThreadThread
Thread
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
Паттерны проектирования
Паттерны проектированияПаттерны проектирования
Паттерны проектирования
 
Android - 01 - Java Basics
Android - 01 - Java BasicsAndroid - 01 - Java Basics
Android - 01 - Java Basics
 
Технологии тестирования Rich Web client, Андрей Плешков, Форум Технологий Mai...
Технологии тестирования Rich Web client, Андрей Плешков, Форум Технологий Mai...Технологии тестирования Rich Web client, Андрей Плешков, Форум Технологий Mai...
Технологии тестирования Rich Web client, Андрей Плешков, Форум Технологий Mai...
 

Odd

  • 2. - Архитектурные паттерны - MVC - MVP - PURE-MVC - Паттерны проектирования - Порождающие паттерны (создание новых объектов) - Структурные паттерны (компоновка системы на основе классов) - Паттерны поведения (связях между объектами и распределением обязанностей) - Идиомы - Pimpl - Shared Pointer
  • 3. абстрактная фабрика Порождающий паттерн Назначение: Система должна оставаться независимой как от процесса создания новых объектов, так и от типов порождаемых объектов.
  • 5. class Footman { public: Footman (); virtual ~Footman() {} }; class Archer { public: Archer (); virtual ~Archer() {} }; class HumanFootman: public Footman { public: … }; class HumanArcher: public Archer { public: … }; class OrcFootman: public Footman { public: … }; class OrcArcher: public Archer { public: … }; Конкретные классы боевых единиц Абстрактные классы боевых единиц
  • 6. class ArmyFactory { protected: vector<Footman*> m_footmanContainer; vector<Archer*> m_archerContainer; public: virtual void AddFootman() = 0; virtual void AddArcher() = 0; }; class HumanArmyFactory: public ArmyFactory { public: void AddFootman() { m_footmanContainer.insert(new HumanFootman); } void AddArcher() { m_archerContainer.insert(new HumanArcher); } }; class OrcArmyFactory: public ArmyFactory { public: void AddFootman() { m_footmanContainer.insert(new OrcFootman); } void AddArcher() { m_archerContainer.insert(new OrcArcher); } }; Абстрактная фабрика Конкретные фабрики
  • 7. class Barracks { public: void Init(ArmyFactory factory) = 0; void CreateFootman(); void CreateArcher(); }; class Reinforcement { public: void Init(ArmyFactory factory) = 0; void CreateFootman(); void CreateArcher(); }; Классы, использующие абстрактную фабрику
  • 8. В связи с изменениями игрового баланса, пехотинцы расы людей должны создаваться по две штуки за раз! Где вы были в январе ???
  • 9. class HumanArmyFactory: public ArmyFactory { public: void AddFootman() { m_footmanContainer.insert(new HumanFootman); m_footmanContainer.insert(new HumanFootman); } void AddArcher() { m_archerContainer.insert(new HumanArcher); } };
  • 10. Я сделал подсчет и решил, что изменения должны затронуть только строение «Барак». Где вы были в январе ???
  • 11. class HumanArmyFactoryExtended: public HumanArmyFactory { public: void AddFootman() { HumanArmyFactory::AddFootman(); m_footmanContainer.insert(new HumanFootman); } void AddArcher() { m_archerContainer.insert(new HumanArcher); } };
  • 12. Стратегия Паттерн поведения Назначение: Существуют системы, поведение которых может определяться согласно одному алгоритму из некоторого семейства. Все алгоритмы этого семейства являются родственными: предназначены для решения общих задач, имеют одинаковый интерфейс для использования и отличаются только реализацией.
  • 14. void Execute(enum E_operation operation) { switch(operation) { case init_gaia: … Break; Case janus_autorize: Break; Case osiris_get_friends: Break; } } void OnGaiaInit(…) { Execute(janus_autorize); } Void OnJanusAutorize(…) { Execute(osiris_get_friends); } Void OnOsirisGetFriends(…) { … } Решение на «скорую руку»
  • 15. Class FederationOperation() { public: E_STATUS GetStatus(); virtual void Execute(); virtual void OnResponce(); } Class FedearionOperationGaiaInit : public FederationOperation { void Init(…args); void Execute(); void OnResponce(); } Class FedearionOperationJanusAutorize : public FederationOperation { void Init(…args); void Execute(); void OnResponce(); } Class FedearionOperationOsirisGetFriends: public FederationOperation { void Init(…args); void Execute(); void OnResponce(); } Решение с использованием паттерна «стратегия»
  • 16. void Login(…args) { m_operations.push(new FedearionOperationGaiaInit ); m_operations.push(new FedearionOperationJanusAutorize ); m_operations.push(new FedearionOperationOsirisGetFriends); } void Update() { if(!m_operations.clear()) { FederationOperation* operation = m_operations.front(); if(opeartion->GetStatus() == E_STATUS_UNKNOWN) { operation.execute(); } if(operation->GetStatus() == E_STATUS_SUCCESSED || operation->GetStatus() == E_STATUS_FAILURE) { m_operations.pop(); } } }
  • 17. Строитель Порождающий паттерн Назначение: Паттерн Строитель отделяет алгоритм поэтапного конструирования сложного продукта (объекта) от его внешнего представления так, что с помощью одного и того же алгоритма можно получать разные представления этого продукта.
  • 18. Задача А запили ты нам систему, по которой из ресурсов будут собираться игровые объекты.
  • 19. Class WoodRequest { public: void Create(); }; Class SteelRequest { public: void Create(); }; Class CoalRequest { public: void Create(); }; Class GrainRequest { public: void Create(); }; class GameObject { public: vector<WoodRequest> m_wood; vector<SteelRequest> m_steel; vector<CoalRequest> m_coal; vector<GrainRequest> m_grain; void Create(); }; class GameObjectBuilder { protected: GameObject* m_gameObject; void RequestWood() { m_wood.insert(new WoodRequest);} void RequestSteel () { m_steel.insert(new SteelRequest);} void RequestCoal() { m_coal.insert(new CoalRequest();} void RequestGrain() {m_grain.insert(new GrainRequest(); } public: virtual void CreateGameObject(); virtual GameObject* GetGameObject() { return m_gameObject; } };
  • 20. class Armory: public GameObjectBuilder { public: void CreateGameObject() { m_gameObject = new GameObject(); RequestWood(); RequestSteel(); RequestCoal(); } }; class Bread: public GameObjectBuilder { public: void CreateGameObject () { m_gameObject = new GameObject(); RequestGrain(); RequestCoal(); } };
  • 21. Команда Паттерн поведения Назначение: Система управляется событиями. При появлении такого события (запроса) необходимо выполнить определенную последовательность действий.
  • 22. Задача Хочу «мишкой» клацать, а «MCV» пускай перемещается, строит, атакует и чинит.
  • 23. Class Unit { public: void move( …args) ; void attack(…args); void build(…args) ; void repair(…args) ; }; class Command { public: virtual void execute(…args) = 0; protected: Command( Unit* unit); Unit* m_unit; }; class MoveCommand: public Command { public: MoveCommand( Unit * unit) : Command(unit) {} void execute(…args) { m_unit->move(…args ); } }; class AttackCommand: public Command { public: AttackCommand( Unit * unit) : Command(unit) {} void execute(…args) { m_unit->attack(…args ); } }; class BuildCommand: public Command { public: BuildCommand( Unit * unit) : Command(unit) {} void execute(…args) { m_unit->build(…args ); } }; class RepairCommand: public Command { public: RepairCommand( Unit * unit) : Command(unit) {} void execute(…args) { m_unit->repair(…args ); } };
  • 24. А теперь по моему приказу пускай все сделает наоборот.
  • 25. class Memento { public: Memento(…args) { m_state = …args; }; private: friend class Unit; ARGS* m_state; }; class Command { public: virtual void execute(…args) = 0; virtual void undo() { m_unit ->RestoreFromMemento(m_memento); } Command( Unit* unit) { m_unit = unit; m_memento = m_unit->CreateMemento(); }; Unit* m_unit; Memento* m_memento; }; Class Unit { private: Memento* CreateMemento(); void RestoreFromMemento(Memento* memento); public: void move( …args) ; void attack(…args); void build(…args) ; void repair(…args) ; };
  • 28. class Unit { public: virtual int GetStrength() = 0; virtual int GetSpeed() = 0; virtual void AddUnit(Unit* unit) { assert( false); }; }; class Archer: public Unit { public: virtual int GetStrength() { return 3; }; virtual int GetSpeed() { return 1; }; }; class Footman: public Unit { public: int GetStrength() { return 2; }; int GetSpeed() { return 2; }; }; class Horseman: public Unit { public: int GetStrength() { return 1; }; int GetSpeed() { return 3; }; };
  • 29. class Legion: public Unit { public: int GetStrength() { … }; int GetSpeed() { … }; void AddUnit(Unit* unit) { m_units.push_back( unit); }; private: std::vector<Unit*> m_units; }; А сюда я вставлю свои cбалансированные формулы.
  • 31.
  • 32. Использование протестированного кода вновь и вновь Разработка с точки зрения абстракции а не реализации Разделение целостной системы на слои (подсистемы) Выводы Стремление инкапсулировать все, что может быть подвержено инкапсуляции Основная идея Побудить желание к написанию структурированного, грамотного и многоразово-используемого кода