設計模式總結之中介者模式

定義:用一箇中介者對象封裝一系列的對象交互,中介者使各個對象不需要顯示地相互作用,從而使耦合鬆散,而且可以獨立改變它們之間的交互。

類型:行爲類模式


中介者模式主要是爲了解決因交互對象較多而造成的耦合度過高,對象關係混亂的問題。

例如:


一個班級各個同學老師之間如果單獨交流,則效率低下,關係複雜。


而建立一個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);
				}
			}
		
	}


}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章