Unity实现设计模式——中介者模式
用一个中介者对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的交互。
这里使用一个生活中的例子来介绍中介者模式,比如当我们在一个聊天大厅进行聊天,每个人可以根据名字给对应的人发送消息,那么A人一定要持有其余人的名字信息吗,要是突然有新的人加入进来需要告知所有人多了个人吗,显然这样的设计方式非常繁琐,我们可以转化为以中介者为中心的星型结构,极大的解耦。
1.AbstractChatroom(The ‘Mediator’ abstract class)
聊天大厅的抽象基类
abstract class AbstractChatroom{public abstract void Register(Participant participant);public abstract void Send(string from, string to, string message);}
2.Chatroom(The ‘ConcreteMediator’ class)
class Chatroom : AbstractChatroom{private Dictionary<string, Participant> _participants =new Dictionary<string, Participant>();public override void Register(Participant participant){if (!_participants.ContainsValue(participant)){_participants[participant.Name] = participant;}participant.Chatroom = this;}public override void Send( string from, string to, string message){Participant participant = _participants[to];if (participant != null){participant.Receive(from, message);}}}
3.Participant(The ‘AbstractColleague’ class)
聊天的参与者基类
class Participant{private Chatroom _chatroom;private string _name;// Constructorpublic Participant(string name){this._name = name;}// Gets participant namepublic string Name{get { return _name; }}// Gets chatroompublic Chatroom Chatroom{set { _chatroom = value; }get { return _chatroom; }}// Sends message to given participantpublic void Send(string to, string message){_chatroom.Send(_name, to, message);}// Receives message from given participantpublic virtual void Receive(string from, string message){Debug.Log(from + " to " + Name + ": '" + message + "'");}}
4.Beatle( A ‘ConcreteColleague’ class)
聊天参与者子类
class Beatle : Participant{// Constructorpublic Beatle(string name): base(name){}public override void Receive(string from, string message){Debug.Log("To a Beatle: ");base.Receive(from, message);}}
5.NonBeatle(A ‘ConcreteColleague’ class)
聊天参与者子类
class NonBeatle : Participant{// Constructorpublic NonBeatle(string name): base(name){}public override void Receive(string from, string message){Debug.Log("To a non-Beatle: ");base.Receive(from, message);}}
6.测试
public class MediatorExample1 : MonoBehaviour{void Start(){// Create chatroomChatroom chatroom = new Chatroom();// Create participants and register themParticipant George = new Beatle("George");Participant Paul = new Beatle("Paul");Participant Ringo = new Beatle("Ringo");Participant John = new Beatle("John");Participant Yoko = new NonBeatle("Yoko");chatroom.Register(George);chatroom.Register(Paul);chatroom.Register(Ringo);chatroom.Register(John);chatroom.Register(Yoko);// Chatting participantsYoko.Send("John", "Hi John!");Paul.Send("Ringo", "All you need is love");Ringo.Send("George", "My sweet Lord");Paul.Send("John", "Can't buy me love");John.Send("Yoko", "My sweet love");}}