Java設置模式之中介者模式

中介者模式是指用一箇中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式的相互引用,從而使其耦合鬆散,而且可以獨立的改變他們之間的交互。
適合中介者模式的情景如下:許多對象以複雜的方式交互,所導致的依賴關係使系統難以維護;一個對象引用其他很多對象,導致難以複用該對象。

生活中有各種各樣的中介機構,這些中介機構給我們的生活帶來了諸多便利。例如:房屋中介機構,可以方便租房和賣房。

讓我們通過一個具體實例,加深理解中介者設計模式。仍以房屋中介功能爲例,實現的功能是:

  1. 租房者發佈租房信息至房屋中介,房屋中介將收到的信息發佈給所有的出租房屋者。
  2. 出租房屋者發佈信息至房屋中介,房屋中介將收到的信息發佈給所有租房者。

Renter.java:租房者

public class Renter {
	
	private String NO;
	private String name;
	private Mediator me;
	
	public Renter(String N, String na, Mediator me) {
		this.NO = N;
		this.name = na;
		this.me = me;
	}
	
	public String getNO() {
		return NO;
	}
	public String getName() {
		return name;
	}

	public void receive(String msg) {
		System.out.println(NO+"\t"+name+"receive:");
		System.out.println("\t"+msg);
	}
	
	public void send(String msg) {
		me.send(this, msg);
	}
	
}

成員變量NO、Name代表求租者賬號、姓名。由於求租者要與中介者通信,因此成員變量包含了中介者Mediator類對象的引用me。receive()方法用於求租者接收來自中介者的信息;send()方法用於求租者向中介者發信息。

Saler.java:出租者類

public class Saler {
	
	private String NO;
	private String name;
	private Mediator me;
	
	public Saler(String no, String name, Mediator me) {
		this.NO = no;
		this.name = name;
		this.me = me;
	}
	
	public String getNO() {
		return NO;
	}
	public String getName() {
		return name;
	}
	
	public void receive(String msg) {
		System.out.println(NO+"\t"+name+"receive:");
		System.out.println("\t"+msg);
	}
	
	public void send(String msg) {
		me.send(this, msg);
	}
}

成員變量NO、Name代表出租者賬號、姓名。由於出租者要與中介者通信,因此成員變量包含了中介者Mediator類對象的引用me。receive()方法用於出租者接收來自中介者的信息;send()方法用於出租者向中介者發信息。

public class Mediator {
	
	Map<String, Renter> m = new HashMap<>();
	Map<String, Saler> m2 = new HashMap<>();
	public void addRenter(Renter r) {
		m.put(r.getNO(), r);
	}
	public void addSaler(Saler s) {
		m2.put(s.getNO(), s);
	}
	
	public void send(Renter r, String msg) {
		System.out.println("come from renter-"+r.getNO()+"-"+r.getName());
		System.out.println("\t"+msg);
		Set<String> se = m2.keySet();
		Iterator<String> it = se.iterator();
		while(it.hasNext()) {
			String key = it.next();
			Saler sa = m2.get(key);
			sa.receive(r.getNO()+"-"+r.getName()+"-"+msg);
		}
	}
	
	public void send(Saler s, String msg) {
		System.out.println("come from saler-"+s.getNO()+"-"+s.getName());
		System.out.println("\t"+msg);	
		Set<String> se = m.keySet();
		Iterator<String> it = se.iterator();
		while(it.hasNext()) {
			String key = it.next();
			Renter r = m.get(key);
			r.receive(s.getNO()+"-"+s.getName()+"-"+msg);
		}
	}
}

這是中介者模式的核心類。由於中介者必須知道所有求租者和出租者的信息,因此定義了求租者集合Map<String,Renter>成員變量m以及出租者集合Map<String,Renter>成員變量m2。addRenter()方法用於向集合m添加新的求租者對象;addSaler()方法用於向集合m2添加新的出租者對象。send(Renter r, String msg)方法用於接收求租者發送的信息,並向所有出租者廣播。send(saler s, String msg)方法用於接收出租者發送的信息,並向所有求租者廣播。

Test.java:測試類

public class Test {
	
	public static void main(String[] args) {
		Mediator me = new Mediator();
		Renter r = new Renter("1000", "li", me);
		Saler s = new Saler("2000", "sun", me);
		Saler s2 = new Saler("2001", "sun2", me);
		me.addRenter(r);
		me.addSaler(s);
		me.addSaler(s2);
		r.send("I want to rent a house");
		s.send("I want to sale a house");
		s2.send("I want to sale a house");
	}
}

測試結果:

come from renter-1000-li
             I want to rent a house
2001     sun2receive:
             1000-li-I want to rent a house
2000     sunreceive:
             1000-li-I want to rent a house
come from saler-2000-sun
             I want to sale a house
1000     lireceive:
             2000-sun-I want to sale a house
come from saler-2001-sun2
             I want to sale a house
1000     lireceive:
            2001-sun2-I want to sale a house

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