行为模式涉及到算法和对象间职责的分配。
mediator:用一个中介对象来封装一系例的对象交互,中介者使各对象不需要显式的相互引用,从而使其耦合松散。而且独立地改变他们之间的交互。
package behaviour.mediator;
/**
* An abstract colleague
*/
public interface Colleague {
public void Change();
public void Action();
}
package behaviour.mediator;
/**
* A concrete colleague
*/
import java.io.*;
public class ColleagueA implements Colleague {
private final String type = "A";
private Mediator med;
public ColleagueA(Mediator m) {
med = m;
med.Register(this, type);
}
public void Change() {
System.out.println("----- A changed now ! -----");
med.Changed(type);
}
public void Action() {
System.out.println(" A is changed by mediator ");
}
}
package behaviour.mediator;
/**
* A concrete colleague
*/
import java.io.*;
public class ColleagueB implements Colleague {
private final String type = "B";
private Mediator med;
public ColleagueB(Mediator m) {
med = m;
med.Register(this, type);
}
public void Change() {
System.out.println("----- B changed now ! -----");
med.Changed(type);
}
public void Action() {
System.out.println(" B is changed by mediator ");
}
}
package behaviour.mediator;
/**
* A concrete colleague
*/
import java.io.*;
public class ColleagueC implements Colleague {
private final String type = "C";
private Mediator med;
public ColleagueC(Mediator m) {
med = m;
med.Register(this, type);
}
public void Change() {
System.out.println("----- C changed now ! -----");
med.Changed(type);
}
public void Action() {
System.out.println(" C is changed by mediator ");
}
}
package behaviour.mediator;
/**
* A concrete mediator
*/
public class ConcreteMediator implements Mediator {
private ColleagueA a;
private ColleagueB b;
private ColleagueC c;
public ConcreteMediator() {
}
public void Register(Colleague colleague, String type) {
if(type == "A") {
a = (ColleagueA)colleague;
} else if (type == "B") {
b = (ColleagueB)colleague;
} else if (type == "C") {
c = (ColleagueC)colleague;
}
}
public void Changed(String type) {
if(type == "A") {
b.Action();
c.Action();
} else if (type == "B") {
a.Action();
c.Action();
} else if (type == "C") {
a.Action();
b.Action();
}
}
}
package behaviour.mediator;
/**
* An abstract Mediator
*/
public interface Mediator {
public void Register(Colleague c, String type);
public void Changed(String type);
}
package behaviour.mediator;
/**
* A test client
*/
public class Test {
public static void main(String[] args) {
Mediator myMed = new ConcreteMediator();
ColleagueA a = new ColleagueA(myMed);
ColleagueB b = new ColleagueB(myMed);
ColleagueC c = new ColleagueC(myMed);
a.Change();
b.Change();
c.Change();
}
}