定義:用一箇中介者對象封裝一系列的對象交互,中介者使各個對象不需要顯示地相互作用,從而使耦合鬆散,而且可以獨立改變它們之間的交互。
類型:行爲類模式
中介者模式主要是爲了解決因交互對象較多而造成的耦合度過高,對象關係混亂的問題。
例如:
一個班級各個同學老師之間如果單獨交流,則效率低下,關係複雜。
而建立一個qq羣,大家都通過qq羣來交流,則耦合度將變得鬆散,qq羣則起到中介作用。
中介者模式設計到三個成員:
抽象中介者:定義好同事類對象到中介者對象的接口,用於各個同事類的通信。一般由一個或多個抽象方法構成,並且由子類實現。
中介者實現類:實現抽象中介者,並通過其一同事類,通知消息給其他同事類。
同事類:本身可以影響其他類,也可以被其他類影響的類,被稱作同事類。也可以是繼承於同一父類的各個子類。
這裏模仿一個客戶和中介的例子,當中介發送消息時,客戶可以通過中介者接收到,客戶發送消息時,中介可以通過中介者接收到。
public abstract class College {
protected Media media;
private String name;
public College() {
// TODO Auto-generated constructor stub
}
public College(Media media, String name) {
super();
this.media = media;
this.name = name;
}
public Media getMedia() {
return media;
}
public void setMedia(Media media) {
this.media = media;
}
public abstract void sendMessage(String msg);
public abstract void receiveMessage(String msg);
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class CustomerCollege extends College {
public CustomerCollege() {
}
public CustomerCollege(Media media, String name) {
super(media,name);
}
@Override
public void sendMessage(String msg) {
media.excute(this, msg);
}
@Override
public void receiveMessage(String msg) {
System.out.println("客戶"+ getName() +"收到消息:"+msg);
}
}
public class MediumCollege extends College{
public MediumCollege() {
// TODO Auto-generated constructor stub
}
public MediumCollege(Media media, String name) {
super(media,name);
}
@Override
public void sendMessage(String msg) {
media.excute(this, msg);
}
@Override
public void receiveMessage(String msg) {
System.out.println("中介:" + getName() + " 收到消息:" + msg);
}
}
public abstract class Media {
protected ArrayList<College> mStudentColleges = new ArrayList<>();
protected ArrayList<College> mTeacherColleges = new ArrayList<>();
public void addCollege(College college){
college.setMedia(this);
if (college instanceof MediumCollege) {
mStudentColleges.add(college);
}else {
mTeacherColleges.add(college);
}
}
public void removeCollege(College college){
if (college instanceof MediumCollege) {
mStudentColleges.remove(college);
}else {
mTeacherColleges.remove(college);
}
}
public abstract void excute(College college,String msg);
}
public class CollegeMedia extends Media{
@Override
public void excute(College college, String msg) {
if (college instanceof MediumCollege) {
for (int i = 0; i < mTeacherColleges.size(); i++) {
mTeacherColleges.get(i).receiveMessage(msg);
}
}else if(college instanceof CustomerCollege){
for (int i = 0; i < mStudentColleges.size(); i++) {
mStudentColleges.get(i).receiveMessage(msg);
}
}
}
}