<?xml version="1.0" encoding="UTF-8"?>
<DesignPattern xmlns="http://www.alshayeb.com/DPDL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.alshayeb.com/DPDL/DPDLSchema.xsd" PatternName="Mediator Design Pattern">
	<StructuralAttributes>
		<Classes>
			<SubGroup groupID="ClientGroup" noOfClasses="1">
				<Class className="Client" isAbstract="No" isParent="No" hasConstructor="Yes" classModifier="public"></Class>
			</SubGroup>
			<SubGroup groupID="MediatorGroup" noOfClasses="1">
				<Class className="Mediator" isAbstract="Yes" isParent="Yes"></Class>
			</SubGroup>
			<SubGroup groupID="cncMediatorGroup" noOfClasses="1">
				<Class className="ConcreteMediator" isAbstract="No" isDerived="Yes" parentId="Mediator"></Class>
			</SubGroup>
			<SubGroup groupID="ColleagueGroup" noOfClasses="1">
				<Class className="Colleague" isAbstract="Yes" isParent="Yes" isDerived="No"></Class>
			</SubGroup>
			<SubGroup groupID="cncColleagueAGroup" noOfClasses="1">
				<Class className="ConcreteColleagueA" hasConstructor="Yes" isAbstract="No" isDerived="Yes" parentId="Colleague"></Class>
			</SubGroup>
			<SubGroup groupID="cncColleagueBGroup" noOfClasses="1">
				<Class className="ConcreteColleagueB" hasConstructor="Yes" isAbstract="No" isDerived="Yes" parentId="Colleague"></Class>
			</SubGroup>			
		</Classes>
		<Operations>
			<SubGroupOp groupID="sendFnGroup" noOfOperations="1">
				<Function functionName="Send" containingClassId="Mediator" isAbstract="Yes" functionModifier="public" returnType="null" inputVariablesIds="{message, colleague}" inputVariablesType="{String, Colleague}"></Function>
			</SubGroupOp>
			<SubGroupOp groupID="setCncCollgueAFnGroup" noOfOperations="1">
				<Function functionName="SetConcreteColleagueA" containingClassId="ConcreteMediator" functionModifier="public" isAbstract="No" returnType="null" inputVariablesIds="{value}" inputVariablesType="{object}"></Function>
			</SubGroupOp>
			<SubGroupOp groupID="setCncCollgueBFnGroup" noOfOperations="1">
				<Function functionName="SetConcreteColleagueB" containingClassId="ConcreteMediator" functionModifier="public" isAbstract="No" returnType="null" inputVariablesIds="{value}" inputVariablesType="{object}"></Function>
			</SubGroupOp>
			<SubGroupOp groupID="setCncMediatorFnGroup" noOfOperations="1">
				<Function functionName="Send" containingClassId="ConcreteMediator" isAbstract="No" functionModifier="public" returnType="null" inputVariablesIds="{message, colleague}" inputVariablesType="{String, Colleague}" isOverRide="Yes"></Function>
			</SubGroupOp>
			<SubGroupOp groupID="CollgueFnGroup" noOfOperations="1">
				<Function functionName="Colleague" containingClassId="Colleague" functionModifier="public" returnType="null" inputVariablesIds="{mediator}" inputVariablesType="{Mediator}" functionType="Constructor"></Function>
			</SubGroupOp>
			<SubGroupOp  groupID="cncCollgueAFnGroup" noOfOperations="1">
				<Function functionName="ConcreteColleagueA" containingClassId="ConcreteColleagueA" functionModifier="public" inputVariablesIds="{mediator}" inputVariablesType="{Mediator}" functionType="Constructor" returnType="null"></Function>
			</SubGroupOp>
			<SubGroupOp  groupID="cncCollgueBFnGroup" noOfOperations="1">
				<Function functionName="ConcreteColleagueB" containingClassId="ConcreteColleagueB" functionModifier="public" inputVariablesIds="{mediator}" inputVariablesType="{Mediator}" functionType="Constructor" returnType="null"></Function>
			</SubGroupOp>			
			<SubGroupOp  groupID="sendCollgueAFnGroup" noOfOperations="1">
				<Function functionName="Send" containingClassId="ConcreteColleagueA" isAbstract="No" functionModifier="public" returnType="null" inputVariablesIds="{message, colleague}" inputVariablesType="{String, Colleague}" isOverRide="Yes"></Function>
			</SubGroupOp>			
			<SubGroupOp  groupID="notifCollgueAFnGroup" noOfOperations="1">
				<Function functionName="Notify" containingClassId="ConcreteColleagueA" functionModifier="public" returnType="null" isAbstract="No" inputVariablesIds="{message}" inputVariablesType="{String}"></Function>
			</SubGroupOp>
			<SubGroupOp  groupID="sendCollgueBFnGroup" noOfOperations="1">
				<Function functionName="Send" containingClassId="ConcreteColleagueB" isAbstract="No" functionModifier="public" returnType="null" inputVariablesIds="{message, colleague}" inputVariablesType="{String, Colleague}" isOverRide="Yes"></Function>
			</SubGroupOp>			
			<SubGroupOp  groupID="notifCollgueBFnGroup" noOfOperations="1">
				<Function functionName="Notify" containingClassId="ConcreteColleagueB" functionModifier="public" returnType="null" isAbstract="No" inputVariablesIds="{message}" inputVariablesType="{String}"></Function>
			</SubGroupOp>
		</Operations>
		<Objects>
			<SubgroupOb groupID="cncMediatorObGroup" noOfObjects="1">
				<Object objectName="m" containingClass="Client" objectClass="ConcreteMediator" objectModifier="private" isList="No"></Object>
			</SubgroupOb>
			<SubgroupOb groupID="mediatorObGroup" noOfObjects="1">
				<Object objectName="mediator" containingClass="Colleague" objectClass="Mediator" objectModifier="protected" isList="No"></Object>
			</SubgroupOb>
			<SubgroupOb groupID="cncClgAObGroup" noOfObjects="1">
				<Object objectName="_colleague" containingClass="ConcreteMediator" objectClass="ConcreteColleagueA" isList="No" objectModifier="private"></Object>
			</SubgroupOb>
			<SubgroupOb groupID="cncClgBObGroup" noOfObjects="1">
				<Object objectName="_colleague" containingClass="ConcreteMediator" objectClass="ConcreteColleagueB" isList="No" objectModifier="private"></Object>
			</SubgroupOb>			
		</Objects>		
		<RelationShips>
			<SubgroupR groupID="ColMedAs" noOfRelations="1">
				<Relation relationName="Association" initiatingClass="Colleague" endClass="Mediator"></Relation>
			</SubgroupR>
			<SubgroupR groupID="MedcncMedGn" noOfRelations="1">
				<Relation relationName="Generalization" initiatingClass="ConcreteMediator" endClass="Mediator"></Relation>
			</SubgroupR>
			<SubgroupR groupID="conColAColGn" noOfRelations="1">
				<Relation relationName="Generalization" initiatingClass="ConcreteColleagueA" endClass="Colleague"></Relation>
			</SubgroupR>
			<SubgroupR groupID="conColAcncMedAs" noOfRelations="1">
				<Relation relationName="Association" endClass="ConcreteColleagueA" initiatingClass="ConcreteMediator"></Relation>
			</SubgroupR>
			<SubgroupR groupID="conColBColGn" noOfRelations="1">
				<Relation relationName="Generalization" initiatingClass="ConcreteColleagueB" endClass="Colleague"></Relation>
			</SubgroupR>
			<SubgroupR groupID="conColBcncMedAs" noOfRelations="1">
				<Relation relationName="Association" endClass="ConcreteColleagueB" initiatingClass="ConcreteMediator"></Relation>
			</SubgroupR>
		</RelationShips>
	</StructuralAttributes>
	<BehavioralAttributes>
		<create callingClass="MainApp" returns="ConcreteMediator" Collection="No" ObjectId="m" objectClass="ConcreteMediator" createType="new"/>
		<create callingClass="MainApp" returns="ConcreteColleagueA" Collection="No" ObjectId="c1" objectClass="ConcreteColleagueA" createType="new"/>
		<create callingClass="MainApp" returns="ConcreteColleagueB" Collection="No" ObjectId="c2" objectClass="ConcreteColleagueB" createType="new"/>
		<SetObject ObjectId="m.ColleagueA" ObjectClass="ConcreteColleagueA" SetTo="c1" CallingClass="MainApp" />
		<SetObject ObjectId="m.ColleagueB" ObjectClass="ConcreteColleagueB" SetTo="c2" CallingClass="MainApp" />
		<call callingClass="MainApp" returns="null" variableType="{String}" variables="{s}" calledClass="ConcreteColleagueA" CallFrom="constructor" calledThrough="c1" Calledfunction="Send">
			<call callingClass="ConcreteColleagueA" returns="null" variableType="{String}" variables="{s}" calledClass="Mediator" CallFrom="function" calledThrough="mediator" Calledfunction="Send"/>
		</call>
		<call callingClass="MainApp" returns="null" variableType="{String}" variables="{s}" calledClass="ConcreteColleagueB" CallFrom="constructor" calledThrough="c2" Calledfunction="Send">
			<call callingClass="ConcreteColleagueB" returns="null" variableType="{String}" variables="{s}" calledClass="Mediator" CallFrom="function" calledThrough="mediator" Calledfunction="Send"/>
		</call>
	</BehavioralAttributes>
</DesignPattern>
