mediator

18

Upload: vivek-mahajan

Post on 04-Jul-2015

220 views

Category:

Career


1 download

TRANSCRIPT

Page 1: mediator
Page 2: mediator

Motivations

lots of classes in the design of framework

If certain principles are not applied the final framework will end in a total mess

to avoid tight coupled frameworks, we need a mechanism to facilitate the interaction between objects in a manner in that objects are not aware of the existence of other objects.

Page 3: mediator

Mediator

Mediator promotes loose coupling by keeping objects from referring to each other explicitly

Page 4: mediator

Intent

Define an object that encapsulates how a set of objects interact.

Design an intermediary to decouple many peers

Promote the many-to-many relationships between interacting peers to “full object status”.

Page 5: mediator

Unmediated

Page 6: mediator

Mediated

Page 7: mediator

Mediator

Page 8: mediator

Check list

Identify a collection of interacting objects that would benefit from mutual decoupling.

Encapsulate those interactions in the abstraction of a new class.

Create an instance of that new class and rework all “peer” objects to interact with the Mediator only.

Page 9: mediator

Balance the principle of decoupling with the principle of distributing responsibility evenly.

Be careful not to create a “controller” or “god” object.

Page 10: mediator

Mediator design example

Let us consider design of a class in which one object send messages to other objects by means of if then if condition explicitly

Page 11: mediator

public class WorkerObject{

private string _message;

public WorkerObject(string message){

_message = message;}

public string Message{

get{return _message;}set{_message = value;}

}

public SendMessage(string message){

Console.WriteLine("Message sent : " + message);}

}

Page 12: mediator

WorkerObject senderObject = new WorkerObject("message0");WorkerObject workerObject1 = new WorkerObject("message1");WorkerObject workerObject2 = new WorkerObject("message2");WorkerObject workerObject3 = new WorkerObject("message3");if(!workerObject1.Message.Equals(senderObject.Message)){

workerObject1.SendMessage(senderObject.Message);}if(!workerObject2.Message.Equals(senderObject.Message)){

workerObject2.SendMessage(senderObject.Message);} if(!workerObject3.Message.Equals(senderObject.Message)){

workerObject3.SendMessage(senderObject.Message);}

Page 13: mediator

Mediator we create a mediator class, DoSomeMediation.

This class contains two methods Register and SendMessage

The Register method catalogs all the classes we want to mediate between.

The SendMessage method is where the functional code actually exists

Page 14: mediator

public class DoSomeMediation{

private static ArrayList _workerObjects = new ArrayList();

public static int Register(WorkerObject workerObject){

return _workerObjects.Add(workerObject);}public static void SendMessage(WorkerObject senderObject){

if(senderObject == null) return;string messageToSend = senderObject.Message;

foreach(WorkerObject workerObject in _workerObjects){

//send message to all other objects registeredif(!workerObject.Message.Equals(senderObject.Message))

workerObject.SendMessage(messageToSend);}

}}

Page 15: mediator

WorkerObject senderObject = new WorkerObject("message0");WorkerObject workerObject1 = new WorkerObject("message1");WorkerObject workerObject2 = new WorkerObject("message2");WorkerObject workerObject3 = new WorkerObject("message3");DoSomeMediation.Register(senderObject);DoSomeMediation.Register(workerObject1);DoSomeMediation.Register(workerObject2);DoSomeMediation.Register(workerObject3);DoSomeMediation.SendMessage(senderObject);

Page 16: mediator

Flow diagramWorkerObj1

Worker Obj2

SenderObjMediator

Page 17: mediator

CCS Model

SenderObject(reg,sendmedmsg,sendobjmsg,printmsg)= reg.sendmedmsg’.SenderObject<reg,sendmedmsg,sendobjmsg,printmsg>

Mediator(sendmedmsg,sendobj1msg,sendobj2msg)= sendmedmsg.sendobj1msg’.Mediator<sendmedmsg,sendobj1msg,sendobj2msg> + sendmedmsg.sendobj2msg’.Mediator<sendmedmsg,sendobj1msg,sendobj2msg>

Workerobj1(reg,sendmedmsg,sendobjmsg,printmsg)=sendobjmsg.printmsg’.Workerobj1<reg,sendmedmsg,sendobjmsg,printmsg>

Workerobj2(reg,sendmedmsg,sendobjmsg,printmsg)=sendobjmsg.printmsg’.Workerobj2<reg,sendmedmsg,sendobjmsg,printmsg>

Page 18: mediator

Simulation on MWB