中介者模式:用一个中介对象来分装一系列对象的交互。中介者使各个对象不需要显式的互相引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。
Colleague:抽象同事类
ConcreteColleague:具体同事类
Mediator:抽象中介者,定义同事对象到中介者对象的接口。
ConcreteMediator:具体中介者对象,实现抽象类的方法。
抽象实例
Colleague.java
public class Colleague {
//每个同事内部维护一个中介者
protected Mediator mediator;
//创建同事时将中介者传入
public Colleague(Mediator mediator){
this.mediator=mediator;
}
}
class ConcreteColleague1 extends Colleague{
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
public void inform(String message){
System.out.println("同事1得到消息:"+message);
}
//通过中介,发送消息
public void send(String message){
mediator.send(message, this);
}
}
class ConcreteColleague2 extends Colleague{
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
public void inform(String message){
System.out.println("同事2得到消息:"+message);
}
//通过中介,发送消息
public void send(String message){
mediator.send(message, this);
}
}
Mediator.java
/**
* 抽象的中介者类,用于传送消息
* @author Carl_Hugo
*/
public abstract class Mediator {
//将消息发送给对方
public abstract void send(String message,Colleague colleague);
}
class ConcreteMediator extends Mediator{
//具体中介者需要传递消息的对象
private ConcreteColleague1 concreteColleague1;
private ConcreteColleague2 concreteColleague2;
/**
* 具体中介者发送消息的实现
*/
@Override
public void send(String message, Colleague colleague) {
//colleague是否是ConcreteColleague的一个实例
if(colleague instanceof ConcreteColleague1){
concreteColleague2.inform(message);
}else{
concreteColleague1.inform(message);
}
}
public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
this.concreteColleague1 = concreteColleague1;
}
public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
this.concreteColleague2 = concreteColleague2;
}
}
Test.java
public class Test {
public static void main(String[] args) {
//创建中介者
ConcreteMediator concreteMediator = new ConcreteMediator();
ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(concreteMediator);
ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(concreteMediator);
concreteMediator.setConcreteColleague1(concreteColleague1);
concreteMediator.setConcreteColleague2(concreteColleague2);
concreteColleague1.send("你吃过饭没啊?");
concreteColleague2.send("吃过了");
}
}
输出
具体实例
代码结构图
UnitedNations.java
public abstract class UnitedNations {
//发表声明
public abstract void declared(String message,Country colleague);
}
class UnitedNationsSecurityCouncil extends UnitedNations{
private USA colleague1;
private Irap colleague2;
@Override
public void declared(String message, Country colleague) {
if(colleague instanceof USA){
colleague2.getMessage(message);
}else{
colleague1.getMessage(message);
}
}
public void setColleague1(USA colleague1) {
this.colleague1 = colleague1;
}
public void setColleague2(Irap colleague2) {
this.colleague2 = colleague2;
}
}
Country.java
public abstract class Country {
protected UnitedNations mediator;
public Country(UnitedNations mediator){
this.mediator=mediator;
}
}
class USA extends Country{
public USA(UnitedNations mediator) {
super(mediator);
}
//声明
public void declare(String message){
mediator.declared(message, this);
}
//获得消息
public void getMessage(String message){
System.out.println("美国获得对方信息:"+message);
}
}
class Irap extends Country{
public Irap(UnitedNations mediator) {
super(mediator);
}
//声明
public void declare(String message){
mediator.declared(message, this);
}
//获得消息
public void getMessage(String message){
System.out.println("伊拉克获得对方信息:"+message);
}
}
Test.java
public class Test {
public static void main(String[] args) {
UnitedNationsSecurityCouncil unitedNationsSecurityCouncil = new UnitedNationsSecurityCouncil();
USA c1 = new USA(unitedNationsSecurityCouncil);
Irap c2 = new Irap(unitedNationsSecurityCouncil);
unitedNationsSecurityCouncil.setColleague1(c1);
unitedNationsSecurityCouncil.setColleague2(c2);
c1.declare("不准研制核武器,否则发动战争");
c2.declare("我们没有研制核武器,也不怕侵略");
}
}
输出