設計模式之中介者模式(行為型)

SmileNicky發表於2019-04-17

[TOC] csdn連結:smilenicky.blog.csdn.net/article/det…

一、模式定義

中介者模式(Mediator Pattern):中介者模式就是用一箇中介物件來封裝一系列的物件的互動,使各物件之間不需要顯式地相互作用,降低物件之間的耦合度,中介者是一種物件行為型模式。

所以中介者模式適用於物件之間存在大量的關聯的情況,假如一個物件改變了,我們就需要跟蹤其關聯物件,做出對於調整,耦合度是很大的,所以就可以用中介者模式來降低耦合度。

二、模式角色

中介者模式包括如下角色:

  • Mediator:抽象中介者
  • ConcreteMediator:具體中介者
  • Colleague:抽象同事類
  • ConcreteColleague:具體同事類

三、模式分析

3.1 模式作用

中介者模式起到中轉的作用,當同事類需要呼叫時,呼叫中介者就好,不需要呼叫同事類,中介者模式將同事物件之間的關係行為進行封裝,起到了協調的作用

3.2 模式優缺點

中介者模式優點:

  • 簡化了物件之間的互動
  • 減少子類生成
  • 解耦各同事類
  • 簡化各同事類的設計和實現

中介者模式缺點:

  • 由於物件之間的互動細節處理都放在中介者這裡,所以具體中介者類就會隨著物件的增多而變得越來越複雜,使中介者類維護起來很困難

3.3 模式經典程式碼

抽象中介者類:

public abstract class Mediator
{
	protected ArrayList colleagues;
	public void register(Colleague colleague)
	{
		colleagues.add(colleague);
	}
	
	public abstract void operation();
}

複製程式碼

具體中介者類:

public class ConcreteMediator extends Mediator
{
	public void operation()
	{
		......
		((Colleague)(colleagues.get(0))).method1();
		......
	}
} 

複製程式碼

抽象同事類:

public abstract class Colleague
{
	protected Mediator mediator;
	
	public Colleague(Mediator mediator)
	{
		this.mediator=mediator;
	}
	
	public abstract void method1();
	
	public abstract void method2();
} 

複製程式碼

具體同事類:

public class ConcreteColleague extends Colleague
{
	public ConcreteColleague(Mediator mediator)
	{
		super(mediator);
	}
	
	public void method1()
	{
		......
	}
	
	public void method2()
	{
		mediator.operation1();
	}
} 

複製程式碼

四、典型例子

例子來自:《設計模式》一書

例項:虛擬聊天室 某論壇系統欲增加一個虛擬聊天室,允許論壇會員通過該聊天室進行資訊交流,普通會員(CommonMember)可以給其他會員傳送文字資訊,鑽石會員(DiamondMember)既可以給其他會員傳送文字資訊,還可以傳送圖片資訊。該聊天室可以對不雅字元進行過濾,還可以對傳送的圖片大小進行控制。用中介者模式設計該虛擬聊天室。

抽象同事類 定義一個Member類,屬於抽象同事類:

public abstract class Member
{
	protected AbstractChatroom chatroom;
	protected String name;
	
	public Member(String name)
	{
		this.name=name;
	}
	
	public String getName()
	{
		return name;
	}
	
	public void setName(String name)
	{
		this.name=name;
	}
	
	public AbstractChatroom getChatroom()
	{
		return chatroom;
	}
	
    public void setChatroom(AbstractChatroom chatroom)
    {
    	this.chatroom=chatroom;
    }
	
	public abstract void sendText(String to,String message);
	public abstract void sendImage(String to,String image);

    public void receiveText(String from,String message)
    {
    	System.out.println(from + "傳送文字給" + this.name + ",內容為:" + message);
    }
    
    public void receiveImage(String from,String image)
    {
    	System.out.println(from + "傳送圖片給" + this.name + ",內容為:" + image);
    }	
}
複製程式碼

具體同事類 具體同事類,繼承抽象同事類Member:

普通會員

public class CommonMember extends Member
{
	public CommonMember(String name)
	{
		super(name);
	}
	
	public void sendText(String to,String message)
	{
	    System.out.println("普通會員傳送資訊:");
	    chatroom.sendText(name,to,message);  //傳送
	}
	
	public void sendImage(String to,String image)
	{
		System.out.println("普通會員不能傳送圖片!");
	}
}
複製程式碼

磚石會員

public class DiamondMember extends Member
{
	public DiamondMember(String name)
	{
		super(name);
	}
	
	public void sendText(String to,String message)
	{
	    System.out.println("鑽石會員傳送資訊:");
	    chatroom.sendText(name,to,message);  //傳送
	}
	
	public void sendImage(String to,String image)
	{
		System.out.println("鑽石會員傳送圖片:");
	    chatroom.sendImage(name,to,image);  //傳送
	}
}
複製程式碼

抽象中介者類

抽象的中介者類,定義聊天室具體有功能方法

public abstract class AbstractChatroom
{
	public abstract void register(Member member);
	public abstract void sendText(String from,String to,String message);
	public abstract void sendImage(String from,String to,String message);
}
複製程式碼

具體中介者類

聊天室功能實現,不需要同事類之間相互呼叫

import java.util.*;

public class ChatGroup extends AbstractChatroom
{
	private Hashtable members=new Hashtable();
	
	public void register(Member member)
	{
		if(!members.contains(member))
		{
			members.put(member.getName(),member);
			member.setChatroom(this);
		}
	}
	
   public void sendText(String from,String to,String message)
   {
   	  Member member=(Member)members.get(to);
   	  String newMessage=message;
   	  newMessage=message.replaceAll("不雅字元","*");
	  member.receiveText(from,newMessage);
   }
   
   public void sendImage(String from,String to,String image)
   {
   	  Member member=(Member)members.get(to);
   	  //模擬圖片大小判斷
   	  if(image.length()>5)
   	  {
   	  	  System.out.println("圖片太大,傳送失敗!");
   	  }
   	  else
   	  {
   	  	  member.receiveImage(from,image);
   	  }
   }
}
複製程式碼

五、模式應用

  • 中介者模式是事件驅動類軟體中應用比較多,中介者模式充當元件之間呼叫的中介,對元件呼叫進行協調
  • MVC是JavaEE的一個基本模式,此時控制器Controller作為一箇中介者,負責檢視物件View和模型物件Model之間的互動,

相關文章