<?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 Template">
	<StructuralAttributes>
		<Classes>
			<SubGroup groupID="clGroup" noOfClasses="1ToMany">
				<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="1ToMany">
				<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="cncColleagueGroup" noOfClasses="1ToMany">
				<Class className="ConcreteColleague" hasConstructor="Yes" isAbstract="No" isDerived="Yes" parentId="Colleague"></Class>
			</SubGroup>
		</Classes>
		<Operations>
			<SubGroupOp groupID="sendMediatorOp" noOfOperations="1">
				<Function functionName="Send" containingClassId="Mediator" isAbstract="Yes" functionModifier="public" returnType="null" inputVariablesIds="{message, colleague}" inputVariablesType="{String, Colleague}"></Function>
			</SubGroupOp>
			<SubGroupOp groupID="setCncMediator" forEach="class" inGroupID="cncColleagueGroup" >
				<Function functionName="SetConcreteColleague" containingClassId="ConcreteMediator" functionModifier="public" isAbstract="No" returnType="null" inputVariablesIds="{value}" inputVariablesType="{object}"></Function>
			</SubGroupOp>			
			<SubGroupOp groupID="sendCncMediatorOp" 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="colleagueOp" noOfOperations="1">
				<Function functionName="Colleague" containingClassId="Colleague" functionModifier="public" returnType="null" inputVariablesIds="{mediator}" inputVariablesType="{Mediator}" functionType="Constructor"></Function>
			</SubGroupOp>
			<SubGroupOp groupID="consCncColleagueOp" inEach="class" inGroupID="cncColleagueGroup">
				<Function functionName="ConcreteColleague" containingClassId="ConcreteColleague" functionModifier="public" inputVariablesIds="{mediator}" inputVariablesType="{Mediator}" functionType="Constructor" returnType="null"></Function>
			</SubGroupOp>
			<SubGroupOp groupID="sendCncColleagueOp" inEach="class" inGroupID="cncColleagueGroup">
				<Function functionName="Send" containingClassId="ConcreteColleague" isAbstract="No" functionModifier="public" returnType="null" inputVariablesIds="{message, colleague}" inputVariablesType="{String, Colleague}" isOverRide="Yes"></Function>
			</SubGroupOp>
			<SubGroupOp groupID="notifyCncColleagueOp" inEach="class" inGroupID="cncColleagueGroup">
				<Function functionName="Notify" containingClassId="ConcreteColleague" functionModifier="public" returnType="null" isAbstract="No" inputVariablesIds="{message}" inputVariablesType="{String}"></Function>
			</SubGroupOp>
		</Operations>
		<Objects>
			<SubgroupOb groupID="cncMediatorOb" inEach="class" inGroupID="clGroup">
				<Object objectName="m" containingClass="Client" objectClass="ConcreteMediator" objectModifier="private" isList="No"></Object>
			</SubgroupOb>
			<SubgroupOb groupID="mediatorOb" noOfObjects="1">
				<Object objectName="mediator" containingClass="Colleague" objectClass="Mediator" objectModifier="protected" isList="No"></Object>
			</SubgroupOb>
			<SubgroupOb groupID="cncMediatorOb" forEach="class" inGroupID="cncColleagueGroup">
				<Object objectName="_colleague" containingClass="ConcreteMediator" objectClass="ConcreteColleague" isList="No" objectModifier="private"></Object>
			</SubgroupOb>
			<SubgroupOb groupID="cncColleagueOb" forEach="class" inGroupID="cncColleague">
				<Object objectName="c" containingClass="Client" objectClass="ConcreteColleague" isList="No" objectModifier="private"></Object>
			</SubgroupOb>
		</Objects>		
		<RelationShips>
			<SubgroupR groupID="clMdAs" noOfRelations="1">
				<Relation relationName="Association" initiatingClass="Colleague" endClass="Mediator"></Relation>
			</SubgroupR>
			<SubgroupR groupID="cmMdGn" noOfRelations="1">
				<Relation relationName="Generalization" initiatingClass="ConcreteMediator" endClass="Mediator"></Relation>
			</SubgroupR>
			<SubgroupR groupID="ccClGn" forEach="class" inGroupID="cncColleagueGroup" changingClass="initiatingClass">
				<Relation relationName="Generalization" initiatingClass="ConcreteColleague" endClass="Colleague"></Relation>
			</SubgroupR>
			<SubgroupR groupID="ccCmAs" forEach="class" inGroupID="cncColleagueGroup" changingClass="endClass">
				<Relation relationName="Association" endClass="ConcreteColleague" initiatingClass="ConcreteMediator"></Relation>
			</SubgroupR>
		</RelationShips>		
	</StructuralAttributes>
	<BehavioralAttributes>
		<create callingClass="MainApp" returns="ConcreteMediator" Collection="No" ObjectId="m" objectClass="ConcreteMediator" createType="new"/>
		<create callingClass="MainApp" returns="ConcreteColleague" Collection="No" ObjectId="c1" objectClass="ConcreteColleagueA" createType="new" ForEach="class" inGroupId="cncColleagueGroup"/>		
		<SetObject ObjectId="m.Colleague" ObjectClass="ConcreteColleague" SetTo="c1" CallingClass="MainApp" ForEach="class" inGroupId="cncColleagueGroup" />
		<call callingClass="MainApp" returns="null" variableType="{String}" variables="{s}" calledClass="ConcreteColleague" CallFrom="constructor" calledThrough="c1" Calledfunction="Send" ForEach="class" inGroupId="cncColleagueGroup">
			<call callingClass="ConcreteColleague" returns="null" variableType="{String}" variables="{s}" calledClass="Mediator" CallFrom="function" calledThrough="mediator" Calledfunction="Send" />
		</call>
	</BehavioralAttributes>
</DesignPattern>
