含义:中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
优点: 1.降低了类的复杂度,将一对多转化成了一对一。
2.各个类之间的解耦
缺点:中介者会庞大,变得复杂难以维护。
主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
使用场景: 1.系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2.想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
C#示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Mediaparten
{
public class ChatRoom
{
public delegate void CallDispMessage(User user, string s);
public CallDispMessage call;
public void showMessage(User user, String message)
{
call(user, message);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Mediaparten
{
public class User
{
private String name;
public ChatRoom chatroom;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public User(String name)
{
this.name = name;
chatroom = new ChatRoom();
}
public void sendMessage(User user, String message)
{
chatroom.showMessage(user, message);
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mediaparten
{
public partial class Form1 : Form
{
public User user;
public Form1()
{
InitializeComponent();
}
public void showmessage(User user,string s)
{
try
{
string str1 = user.getName();
string str2 = DateTime.Now.ToString();
string str3 = s;
listBox1.Items.Add(str1);
listBox1.Items.Add(str2);
listBox1.Items.Add(str3);
}
catch (Exception ex)
{
}
}
private void btn_John_Click(object sender, EventArgs e)
{
User John = new User("John");
John.chatroom.call += new ChatRoom.CallDispMessage(showmessage);
John.sendMessage(John,txtJohn.Text.ToString());
}
private void btn_Tom_Click(object sender, EventArgs e)
{
User Tom = new User("Tom");
Tom.chatroom.call += new ChatRoom.CallDispMessage(showmessage);
Tom.sendMessage(Tom, txtTom.Text.ToString());
}
}
}