JAVA设计模式结课论文-中介者模式
《程序设计模式》结课论文
2012 — 2013学年 第 二 学期
论文题目 Java设计模式
学生姓名
学 号
专业班级
指导教师
2013年 7 月 4 日
中介者模式
1.中介者模式概述
一个对象含有另一个对象的引用是面向对象中经常使用的方式,也是面向对象所提倡的,即少用继承多用组合。但是怎样合理地组合对象对系统今后的发展、维护和对象的复用是至关重要的。在面向对象的编程中,如果对象A含有对象B的引用,人们习惯地称B是A的朋友。如果B是A的朋友,那么对象A就可以请求B执行相关的操作。但是,对某些特殊系统,特别是涉及很多对象时,该系统可能不希望这些对象直接交互,即不希望这些对象之间相互包含对方的引用成为朋友,其原因是不利于系统今后的发展、维护以及对象的复用。 中介者模式是封装一系列的对象交互的成熟模式,其关键是将对象之间的交互封装在称作中介者的对象中,中介者使各对象不需要显示地相互引用,这些对象只包含中介者的引用。当系统中某个对象需要和系统中另外一个对象交互时,只需将自己的请求通知中介者即可。
2.中介者模式的定义
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
3. 中介者模式的结构和使用
一、中介者模式的结构
1) 抽象中介者(Mediator)角色:抽象中介者角色定义统一的接口用于各同事角色之间的通信。
2) 具体中介者(Concrete Mediator)角色:具体中介者角色通过协调各同事角色实现协作行为。为此它要知道并引用各个同事角色。
3) 同事(Colleague)角色:每一个同事角色都知道对应的具体中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作
二、中介者模式的使用
由于中介者的行为与要使用的数据与具体业务紧密相关,抽象中介者角色提供一个能方便很多对象使用的接口是不太现实的。
所以抽
象中介者角色往往是不存在的,或者只是一个标示接口。如果有幸能够提炼出真正带有行为的抽象中介者角色,我想同事角色对具体中介者角色的选择也是策略的一种应用
4、中介者模式的优点和缺点
一、中介者模式的优点
1) 可以避免许多的对象为了之间的通信而相互显示引用,不仅系统难于维护,而且也使其他系统难以复用这些对象。
2) 可以通过中介者将原本分布于多个对象之间的交互行为集中在一起。当这些对象之间需要改变之间的通信行为时,只需使用一个具体中介者即可,不必修改各个具体同事的代码,即这些同事可被重用。
3) 具体中介者使得各个具体同事完全解耦,修改任何一个具体同事的代码不会影响到其他同事。
4) 具体中介者集中了同事之间是如何交互的细节,使得系统比较清楚地知道整个系统中的同事是如何交互的。
5) 当一些对象想互相通信,但又无法相互包含对方的引用,那么使用中介者模式就可以使得这些对象互相通信。
二、中介者模式的缺点:
中介者模式的缺点是显而易见的,因为这个“中介“承担了较多的责任,所以一旦这个中介对象出现了问题,那么整个系统就会受到重大的影响。
5. 适合使用中介者模式的情景
1) 许多对象以复杂的方式交互,所导致的依赖关系使系统难以理解和维护。
2) 一个对象引用其他很多对象,导致难以复用该对象。
6. 中介者模式在Java中的应用 古代相互交战的A,B,C三方,想通过一个中介者调停之间的战火。A方委托调停者转达的信息是:“要求B方归还曾抢夺的100斤土豆,要求C方归还曾抢夺的20头牛”;B方委托调停者转达的信息是:“要求A方归还曾抢夺的10只鸡,要求C方归还曾抢夺的15匹马”;C方委托调停者转达的信息是:“要求A方归还曾抢夺的300斤小麦,要求B方归还曾抢夺的50头驴”。
1.同事(Colleague) : Colleague.java
public interface Colleague{
public void giveMess(String [] mess);
public void receiverMess(String mess);
public void setName(String name);
public String getName();
}
注:本问题中,只需要一个具体中介者,我们并不需要一个中介者(Mediator)接口 。
2.具体中介者(Mediator) : ConcreteMediator.java
public class ConcreteMediator{
ColleagueA colleagueA;
ColleagueB colleagueB;
ColleagueC colleagueC;
public void registerColleagueA(ColleagueA colleagueA){
this.colleagueA=colleagueA;
}
public void registerColleagueB(ColleagueB colleagueB){
this.colleagueB=colleagueB;
}
public void registerColleagueC(ColleagueC colleagueC){
this.colleagueC=colleagueC;
}
public void deliverMess(Colleague colleague,String [] mess){
if(colleague==colleagueA){
if(mess.length>=2){
colleagueB.receiverMess(colleague.getName()+mess[0]); colleagueC.receiverMess(colleague.getName()+mess[1]); }
}
else if(colleague==colleagueB){
if(mess.length>=2){
colleagueA.receiverMess(colleague.getName()+mess[0]); colleagueC.receiverMess(colleague.getName()+mess[1]); }
}
else if(colleague==colleagueC){
if(mess.length>=2){
colleagueA.receiverMess(colleague.getName()+mess[0]); colleagueB.receiverMess(colleague.getName()+mess[1]); }
}
}
}
3.具体同事(ConcreteColleague)_1: ColleagueA.java
public class ColleagueA implements Colleague{
ConcreteMediator mediator; String name;
ColleagueA(ConcreteMediator mediator){
this.mediator=mediator;
mediator.registerColleagueA(this);
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void giveMess(String [] mess){
mediator.deliverMess(this,mess);
}
public void receiverMess(String mess){
System.out.println(name+
System.out.println(
}
}
4.应用 Application.java
public class Application{
public static void main(String args[]){
ConcreteMediator mediator=new ConcreteMediator();
ColleagueA colleagueA=new ColleagueA(mediator);
ColleagueB colleagueB=new ColleagueB(mediator);
ColleagueC colleagueC=new ColleagueC(mediator);
colleagueA.setName(
colleagueB.setName(
colleagueC.setName(
String [] messA={
colleagueA.giveMess(messA);
String [] messB={
colleagueB.giveMess(messB);
String [] messC={
colleagueC.giveMess(messC);
}
}
7. 综合应用举例
代码如下: 1 //Mediator
2 abstract class AbstractChatroom
3 {
4 public abstract void Register(Participant participant);
5 public abstract void Send(string from, string to, string message);
6 }
1 //ConcreteMediator
2 class Chatroom :AbstractChatroom
3 {
4 private Hashtable participants = new Hashtable();
5 public override void Register(Participant participant) 6 {
7 if (participants[participant.Name] == null)
8 {
9 participants[participant.Name]=participant;
10 }
11 participant.Chatroom = this;
12 }
13 public override void Send(string from, string to, string message) 14 {
15 Participant pto = (Participant)participants[to];
16 if (pto != null)
17 {
18 pto.Receive(from, message); 19 }
20 }
21 }
1 //AbstractColleague
2 class Participant
3 {
4 private Chatroom chatroom;
5 private string name;
6
7 //Constructor
8 public Participant(string name)
9 {
10 this.name = name;
11 }
12 //Properties
13 public string Name
14 {
15 get { return name; }
16 }
17 public Chatroom Chatroom
18 {
19 set { chatroom = value; }
20 get { return chatroom; }
21
22 }
23 public void Send(string to, string message)
24 {
25 chatroom.Send(name, to, message);
26 }
27 public virtual void Receive(string from, string message) 28 {
29 Console.WriteLine(
31 }
1 //ConcreteColleaguel
2 class Beatle :Participant
3 {
4 //Constructor
5 public Beatle(string name)
6 : base(name)
7 { }
8 public override void Receive(string from, string message) 9 {
10 Console.Write(
11 base.Receive(from, message);
12 }
13 }
1 //ConcreteColleague2
2 class NonBeatle :Participant
3 {
4 //Constructor
5 public NonBeatle(string name)
6 : base(name)
7 { }
8 public override void Receive(string from, string message) 9 {
10 Console.Write(
11 base.Receive(from, message);
12 }
13 }
客户端调用如下:
1 static void Main(string[] args)
2 {
3 //create chatroom
4 Chatroom chatroom = new Chatroom();
5 //Create participants and register them 6 Participant George = new Beatle(
12 chatroom.Register(Paul);
13 chatroom.Register(Ringo);
14 chatroom.Register(John);
15 chatroom.Register(Yoko);
16
17 //chatting participants
18 Yoko.Send(
19 Paul.Send(
运行结果如下: