//+------------------------------------------------------------------+ //| 201028_095428.mq5 | //| 2019-2020, dimitri pecheritsa | //| 792112@gmail.com | //+------------------------------------------------------------------+ // from: design patterns: elements of reusable object-oriented software // by gof: erich gamma, richard helm, ralph johnson, john vlissides // published in 1994 //+------------------------------------------------------------------+ //| mediator - behavioral design pattern | //+------------------------------------------------------------------+ // define an object that encapsulates how a set of objects interact // mediator promotes loose coupling by keeping objects from referring // to each other explicitly, and it lets you vary their interaction // independently //+------------------------------------------------------------------+ //| applicability | //+------------------------------------------------------------------+ // a set of objects communicate in well-defined but complex ways. // the resulting interdependencies are unstructured and difficult to // understand // reusing an object is difficult because it refers to and communicates // with many other objects // a behavior that's distributed between several classes should be // customizable without a lot of subclassing //+------------------------------------------------------------------+ //| structure | //+------------------------------------------------------------------+ // // mediator // |Mediator|<-----------------------|Colleague| // ^ ^ // | | // | +-------------+------------+ // | | | //|ConcreteMediator|-->|ConcreteColleague1| +-->|ConcreteColleague2| // | | // +---------------------------+ // //+------------------------------------------------------------------+ //| typical object structure | //+------------------------------------------------------------------+ // // |aColleague| // |----------| // |* mediator| // | // | |aColleague| // | |----------| // |aColleague| v +---|* mediator| // |----------| | ^ // |mediator *|----->|aConcreteMediator|<---+ | // |-----------------| | // | * * *-|--------------+ // | ^ ^ | // | | | | // | | | | // |aColleague|<----------+ | | | // |----------| | | +--->|aColleague| // |mediator *|--------------+ | |----------| // +-------|* mediator| // //+------------------------------------------------------------------+ //| participants | //+------------------------------------------------------------------+ // mediator // defines an interface for communicating with colleague objects // concrete mediator // implements cooperative behavior by coordinating colleague objects // knows and maintains its colleagues // colleague classes // each colleague class knows its mediator object // each colleague communicates with its mediator whenever it would have // otherwise communicated with another colleague //+------------------------------------------------------------------+ //| collaborations | //+------------------------------------------------------------------+ #include <Mqh201028_103044.mqh> //colleague #include <Mqh201028_102459.mqh> //mediator #include <Mqh201028_102504.mqh> //concrete colleague 1 #include <Mqh201028_103427.mqh> //concrete colleague 2 #include <Mqh201028_102503.mqh> //concrete mediator // colleagues send and receive requests from a mediator object // the mediator implements the cooperative behavior by routing requests // between the appropriate colleague(s) //--- void OnStart() { ConcreteMediator mediator; Colleague* colleague_1=new ConcreteColleague1(mediator); Colleague* colleague_2=new ConcreteColleague2(mediator); mediator.colleague_1=colleague_1; mediator.colleague_2=colleague_2; colleague_1.Send("message 1"); colleague_2.Send("message 2"); //--- delete colleague_1; delete colleague_2; } //+------------------------------------------------------------------+ //| output | //+------------------------------------------------------------------+ // colleague 1 sending message 1 // colleague 2 notified about message 1 // colleague 2 sending message 2 // colleague 1 notified about message 2 //+------------------------------------------------------------------+ //| consequences | //+------------------------------------------------------------------+ // it limits subclassing // it simplifies object protocols // it abstracts how objects cooperate // it centralizes control //+------------------------------------------------------------------+ //| implementation | //+------------------------------------------------------------------+ // omitting the abstract mediator class // colleague-mediator communication //+------------------------------------------------------------------+ //| related patterns | //+------------------------------------------------------------------+ // facade // observer //+------------------------------------------------------------------+