一、中介者模式简介(Brief Introduction)
中介者模式(Mediator Pattern),定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,
从而使其耦合性松散,而且可以独立地改变他们之间的交互。 Define an object that encapsulates how a set of
objects interact. Mediator promotes loose coupling by keeping objects from referring to each
other explicitly, and it lets you vary their interaction independently。中介者减少了各个同事对象的
耦合,使得可以独立地改变和复用各个同事对象和中介者类;由于把对想如何协作进行了抽象,将中介作为一个独立的概念并将其封
装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏伟的角度去考虑系统。
二、解决的问题(What To Solve)
中介者模式一般应用于一组对象以定义良好但是复杂的方法进行通信的场合,以及想定制一个分布在多个类中的行为,而不想生成太
多的子类的场合。
三、中介者模式分析(Analysis)
中介者模式(Mediator Pattern),定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,
从而使其耦合性松散,而且可以独立地改变他们之间的交互。 Define an object that encapsulates how a set of
objects interact. Mediator promotes loose coupling by keeping objects from referring to each
other explicitly, and it lets you vary their interaction independently。中介者减少了各个同事对象的
耦合,使得可以独立地改变和复用各个同事对象和中介者类;由于把对想如何协作进行了抽象,将中介作为一个独立的概念并将其封
装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏伟的角度去考虑系统。
二、解决的问题(What To Solve)
中介者模式一般应用于一组对象以定义良好但是复杂的方法进行通信的场合,以及想定制一个分布在多个类中的行为,而不想生成太
多的子类的场合。
三、中介者模式分析(Analysis)
如图:
举例如下(举例是去中介交换水果):
package design.mediator;
/**
* 文件名称:Fruits.java
* 创建人:Fei Wong
* 创建时间: Jun 21, 2012
* 电子邮箱:
* 说明:定义各种水果,大家都可以去中介进行交换
* */
public enum Fruits {
APPLE , BANANA , ORANGE , PEAR , GRAPE , PEACH
}
package design.mediator;
import java.util.HashMap;
import java.util.Map;
/**
* 文件名称:Intermediary.java
* 创建人:Fei Wong
* 创建时间: Jun 21, 2012
* 电子邮箱:
* 说明,设置交换规则,
* 如。苹果只能交换香蕉 等
* */
public class Intermediary {
private static Map<Fruits,Fruits>changeFruits;
/**
* 设定交换规则
* */
static{
changeFruits = new HashMap<Fruits, Fruits>() ;
changeFruits.put(Fruits.APPLE , Fruits.BANANA ) ;
changeFruits.put(Fruits.BANANA , Fruits.GRAPE ) ;
changeFruits.put(Fruits.GRAPE , Fruits.ORANGE ) ;
changeFruits.put(Fruits.ORANGE , Fruits.PEACH ) ;
changeFruits.put(Fruits.PEACH , Fruits.PEAR ) ;
changeFruits.put(Fruits.PEAR , Fruits.APPLE ) ;
}
/**
* 获取能交换到的水果
* */
public static Fruits get(Fruits fruit) {
return changeFruits.get( fruit ) ;
}
}
package design.mediator;
/**
* 文件名称:Main.java
* 创建人:Fei Wong
* 创建时间: Jun 21, 2012
* 电子邮箱:
* 测试
* */
public class Main {
public static void main(String[] args) {
Mediator mediator1 = new Mediator() ;
Mediator mediator2 = new Mediator() ;
Mediator mediator3 = new Mediator() ;
Mediator mediator4 = new Mediator() ;
Mediator mediator5 = new Mediator() ;
Mediator mediator6 = new Mediator() ;
mediator1.put( Fruits.APPLE ) ;
mediator2.put( Fruits.BANANA ) ;
mediator3.put( Fruits.GRAPE ) ;
mediator4.put( Fruits.ORANGE ) ;
mediator5.put( Fruits.PEACH ) ;
mediator6.put( Fruits.PEAR ) ;
System.out.println( "我拿到了-->" + mediator1.get() );
System.out.println( "我拿到了-->" + mediator2.get() );
System.out.println( "我拿到了-->" + mediator3.get() );
System.out.println( "我拿到了-->" +mediator4.get() );
System.out.println( "我拿到了-->" +mediator5.get() );
System.out.println( "我拿到了-->" +mediator6.get() );
}
}
package design.mediator;
import java.util.List;
import java.util.Vector;
/**
* 文件名称:IMediator.java
* 创建人:Fei Wong
* 创建时间: Jun 21, 2012
* 电子邮箱:
* 中介的功能就是两个,
* 1、拿客户的的水果
* 2、给客户新的水果
* 中介仓库
* 仓库里面存放水果
* */
public interface IMediator {
List<Fruits> fruits = new Vector<Fruits>() ;
void put(Fruits fruits) ;
Fruits get() ;
}
package design.mediator;
/**
* 文件名称:Mediator.java
* 创建人:Fei Wong
* 创建时间: Jun 21, 2012
* 电子邮箱:
* 说明:
* 实际交换位置
* */
public class Mediator implements IMediator {
private Fruits fruit = null ;
@Override
public Fruits get() {
if(fruit == null){
return null ;
}
Fruits f = Intermediary.get( fruit ) ;
if(fruits.contains(f)){
fruits.remove( f ) ;
return f ;
}
return null ;
}
@Override
public void put(Fruits fruit) {
this.fruit = fruit ;
synchronized(IMediator.class ) {
IMediator.fruits.add( fruit ) ;
}
}
}