Files
2025-06-24 00:33:04 +01:00

187 lines
16 KiB
Plaintext

//+------------------------------------------------------------------+
//| PROGRAMMING PATTERNS - STRATEGY |
//| Incapsulate a family of interchangeable algorythms which can be |
//| modified independently from the client. |
//| |
//| OOP CONCEPTS: Abstraction, Encapsulation, Polymorphism, |
//| Inheritance |
//| |
//| RULES: |
//| Encapsulate changes |
//| Composition is better than inheritance. |
//| Engineer with interfaces, not real classes. |
//| |
//| A good architecture is extendable, supportable, and reusable. |
//| Patterns help build hq systems. |
//| Patterns are proven to be good by experience. |
//| Patterns are generic solitions for software engineering |
//| challenges. |
//| Choose your pattern, don't invent it. |
//| Most patterns are designed to manage changes of the architecture.|
//| Most patterns incapsulate variable aspects of the systems. |
//| Developers know patterns and effectively communicate with each |
//| other. |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| BEHAVIOR A INTERFACE |
//+------------------------------------------------------------------+
interface I_BehaviorA
{
void Act();
};
//+------------------------------------------------------------------+
//| BEHAVIOR B INTERFACE |
//+------------------------------------------------------------------+
interface I_BehaviorB
{
void Act();
};
//+------------------------------------------------------------------+
//| REAL BEHAVIOR A - OPTION A |
//+------------------------------------------------------------------+
class C_BehaviorAA : public I_BehaviorA
{
public:
void Act() { Print(" • Doing A the a way"); }
};
//+------------------------------------------------------------------+
//| REAL BEHAVIOR A - OPTION B |
//+------------------------------------------------------------------+
class C_BehaviorAB : public I_BehaviorA
{
public:
void Act() { Print(" • Doing A the b way"); }
};
//+------------------------------------------------------------------+
//| REAL BEHAVIOR A - OPTION C |
//+------------------------------------------------------------------+
class C_BehaviorAC : public I_BehaviorA
{
public:
//--- empty implementation
void Act() { Print(" • Doing A is impossible"); }
};
//+------------------------------------------------------------------+
//| REAL BEHAVIOR B - OPTION A |
//+------------------------------------------------------------------+
class C_BehaviorBA : public I_BehaviorB
{
public:
void Act() { Print(" • Doing B the a way"); }
};
//+------------------------------------------------------------------+
//| REAL BEHAVIOR B - OPTION B |
//+------------------------------------------------------------------+
class C_BehaviorBB : public I_BehaviorB
{
public:
void Act() { Print(" • Doing B the b way"); }
};
//+------------------------------------------------------------------+
//| REAL BEHAVIOR C - OPTION C |
//+------------------------------------------------------------------+
class C_BehaviorBC : public I_BehaviorB
{
public:
//--- empty implementation
void Act() { Print(" • Doing B is impossible"); }
};
//+------------------------------------------------------------------+
//| ABSTRACT OBJECT |
//+------------------------------------------------------------------+
class A_Object
{
public:
~A_Object()
{
if(CheckPointer(behavior_a)==POINTER_DYNAMIC) delete behavior_a;
if(CheckPointer(behavior_b)==POINTER_DYNAMIC) delete behavior_b;
}
virtual void Name()=0;
void ActA() { behavior_a.Act(); }
void ActB() { behavior_b.Act(); }
void ActC() { Print(" • Doing C the common way"); }
void SetBehaviorA(I_BehaviorA *b)
{
if(CheckPointer(behavior_a)==POINTER_DYNAMIC) delete behavior_a;
behavior_a=b;
}
void SetBehaviorB(I_BehaviorB *b)
{
if(CheckPointer(behavior_b)==POINTER_DYNAMIC) delete behavior_b;
behavior_b=b;
}
protected:
I_BehaviorA *behavior_a;
I_BehaviorB *behavior_b;
};
//+------------------------------------------------------------------+
//| REAL OBJECT A |
//+------------------------------------------------------------------+
class C_ObjectA : public A_Object
{
public:
//--- default behavior
C_ObjectA()
{
behavior_a=new C_BehaviorAA();
behavior_b=new C_BehaviorBA();
}
void Name() { Print("Object A"); }
};
//+------------------------------------------------------------------+
//| REAL OBJECT B |
//+------------------------------------------------------------------+
class C_ObjectB : public A_Object
{
public:
//--- default behavior
C_ObjectB()
{
behavior_a=new C_BehaviorAB();
behavior_b=new C_BehaviorBA();
}
void Name() { Print("Object B"); }
};
//+------------------------------------------------------------------+
//| CLIENT |
//+------------------------------------------------------------------+
void OnStart()
{
//--- default real object behavior
A_Object *object_a=new C_ObjectA;
object_a.Name();
object_a.ActA();
object_a.ActB();
object_a.ActC();
//--- dynamically change behavior
A_Object *object_b=new C_ObjectB;
object_b.Name();
object_b.ActA();
object_b.ActB();
object_b.ActC();
object_b.SetBehaviorA(new C_BehaviorAA);
object_b.ActA();
object_b.SetBehaviorA(new C_BehaviorAC);
object_b.ActA();
//---
delete object_a;
delete object_b;
}
//+------------------------------------------------------------------+
//| OUTPUT |
//| |
//| Object A |
//| • Doing A the a way |
//| • Doing B the a way |
//| • Doing C the common way |
//| Object B |
//| • Doing A the b way |
//| • Doing B the a way |
//| • Doing C the common way |
//| • Doing A the a way |
//| • Doing A is impossible |
//+------------------------------------------------------------------+