Created
December 6, 2011 23:04
-
-
Save jgxvx/1440484 to your computer and use it in GitHub Desktop.
A basic mediator pattern example for PVAJ class
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package ch.juerggutknecht.ffhs.pvaj.mediator.example; | |
/* | |
* Copyright (c) 2012 Juerg Gutknecht | |
* | |
* This program is free software: you can redistribute it and/or modify | |
* it under the terms of the GNU General Public License as published by | |
* the Free Software Foundation, either version 3 of the License, or | |
* (at your option) any later version. | |
* | |
* This program is distributed in the hope that it will be useful, | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
* GNU General Public License for more details. | |
* | |
* You should have received a copy of the GNU General Public License | |
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
*/ | |
/** | |
* A basic mediator pattern example. | |
* | |
* Let's assume we have a social media manager. If we post something on one | |
* platform, it should be shared on other platforms we have accounts for. | |
* | |
* But we don't want to share everything everywhere. If we post something for | |
* our friends on Facebook, we want to share it on Google+, but probably not on | |
* Twitter and certainly not with our business contacts on LinkedIn and Xing. | |
* | |
* We're using the mediator design pattern to centralize communication between | |
* our social media platforms. | |
* | |
* @author Juerg Gutknecht <juerg.gutknecht@students.ffhs.ch> | |
* @version 1.2 | |
* | |
* Jan 14, 2012 | |
*/ | |
public class MediatorExample { | |
public static void main(String[] args) { | |
Mediator mediator = new Mediator(); | |
SocialMediaPlatform facebook = new SocialMediaPlatform("Facebook", mediator); | |
SocialMediaPlatform twitter = new SocialMediaPlatform("Twitter", mediator); | |
SocialMediaPlatform google = new SocialMediaPlatform("Google+", mediator); | |
SocialMediaPlatform linkedIn = new SocialMediaPlatform("LinkedIn", mediator); | |
SocialMediaPlatform xing = new SocialMediaPlatform("Xing", mediator); | |
mediator.setFacebook(facebook); | |
mediator.setTwitter(twitter); | |
mediator.setGooglePlus(google); | |
mediator.setLinkedIn(linkedIn); | |
mediator.setXing(xing); | |
SocialMediaPlatform[] platforms = {facebook, twitter, google, linkedIn, xing}; | |
for (SocialMediaPlatform platform : platforms) { | |
platform.post("Posting something on " + platform + "..."); | |
try { | |
System.out.println(""); | |
Thread.sleep(1000); | |
} catch (InterruptedException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
} | |
//////////////////////////////////////////////////////////////////////////////// | |
/** | |
* Mediator implementation | |
* | |
* @author Juerg Gutknecht <juerg.gutknecht@students.ffhs.ch> | |
* @version 1.2 | |
*/ | |
class Mediator { | |
private SocialMediaPlatform facebook; | |
private SocialMediaPlatform twitter; | |
private SocialMediaPlatform google; | |
private SocialMediaPlatform linkedIn; | |
private SocialMediaPlatform xing; | |
public void update(SocialMediaPlatform colleague, Object arg) { | |
if (colleague == this.facebook) { | |
this.twitter.share(colleague, (String)arg); | |
this.google.share(colleague, (String)arg); | |
} else if (colleague == this.twitter) { | |
this.facebook.share(colleague, (String)arg); | |
this.google.share(colleague, (String)arg); | |
} else if (colleague == this.google) { | |
this.twitter.share(colleague, (String)arg); | |
this.facebook.share(colleague, (String)arg); | |
} else if (colleague == this.linkedIn) { | |
this.xing.share(colleague, (String)arg); | |
this.google.share(colleague, (String)arg); | |
} else if (colleague == this.xing) { | |
this.linkedIn.share(colleague, (String)arg); | |
this.google.share(colleague, (String)arg); | |
} | |
} | |
public void setFacebook(SocialMediaPlatform facebook) { this.facebook = facebook; } | |
public void setTwitter(SocialMediaPlatform twitter) { this.twitter = twitter; } | |
public void setLinkedIn(SocialMediaPlatform linkedIn) { this.linkedIn = linkedIn; } | |
public void setXing(SocialMediaPlatform xing) { this.xing = xing; } | |
public void setGooglePlus(SocialMediaPlatform google) { this.google = google; } | |
} | |
//////////////////////////////////////////////////////////////////////////////// | |
/** | |
* A social media platform abstraction. Social media platforms are the | |
* colleagues in this mediator pattern example. | |
* | |
* @author Juerg Gutknecht <juerg.gutknecht@students.ffhs.ch> | |
* @version 1.2 | |
*/ | |
class SocialMediaPlatform { | |
public String name = "Generic Social Media Platform"; | |
private Mediator mediator; | |
public SocialMediaPlatform(String name, Mediator mediator) { | |
this.name = name; | |
this.mediator = mediator; | |
} | |
public String toString() { return this.name; } | |
public void notifyMediator(Object arg) { | |
this.mediator.update(this, arg); | |
} | |
public void post(String status) { | |
System.out.printf("[%s] %s\n", this.name, status); | |
this.notifyMediator(status); | |
} | |
public void share(SocialMediaPlatform source, String message) { | |
System.out.printf("[%s] From %s: %s\n", this.name, source.name, message); | |
} | |
} | |
//////////////////////////////////////////////////////////////////////////////// | |
// Life without the mediator pattern: | |
// 1. Subclasses for all social media platforms | |
// 2. Tighter coupling, e.g. Facebook needs to know Twitter and Google+ | |
// 3. Overriding the post() method to call the share() methods directly | |
class Facebook extends SocialMediaPlatform { | |
private SocialMediaPlatform twitter; | |
private SocialMediaPlatform google; | |
public Facebook(String name, Mediator mediator) { | |
super(name, mediator); | |
} | |
@Override | |
public void post(String status) { | |
System.out.printf("[%s] %s\n", this.name, status); | |
this.twitter.share(this, status); | |
this.google.share(this, status); | |
} | |
// Setters for Twitter and Google+ here... | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment