1 Mediator 定义
用一个中介对象来封装一系列关于对象交互行为。
2 为何使用 Mediator?
刚刚参力口工作想租房,可以找“房屋中介”;或者,自己刚刚到一个陌生城市找工作,可以找“人才交流中心”寻找机会。
在软件的开发过程中,这样的例子也很多,例如,在 MVC 框架中,控制器(C)就是模型(M)和视图(V)的中介者;还有大家常用的 QQ 聊天程序的“中介者”是 QQ 服务器。所有这些,都可以采用“中介者模式”来实现,它将大大降低对象之间的耦合性,提高系统的灵活性。
各个对象之间的交互操作非常多;每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉及到修改很多其他对象的行为,如果使用 Mediator 模式,可以使各个对象间的耦合松散,只需关心和 Mediator 的关系,使多对多的关系变成了一对多的关系,可以降
低系统的复杂性,提高可修改扩展性。
3 如何使用?
举例 午饭后,吉永老师来组织大家玩交换水果的游戏。
package xx.study.design.mediator;
/**
* 小朋友交换水果
*/
public class MediatorDemo {
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 xx.study.design.mediator;
import java.util.List;
import java.util.Vector;
/**
* 定义一个中介对象来封装系列对象之间的交互
*/
public interface IMediator {
List<Fruits> fruits = new Vector<Fruits>() ;
void put(Fruits fruits) ;
Fruits get() ;
}
package xx.study.design.mediator;
public class Mediator implements IMediator {
private Fruits fruit = null ;
public Fruits get() {
if(fruit == null){
return null ;
}
Fruits f = LuckyDraw.get( fruit ) ;
if(fruits.contains(f)){
fruits.remove( f ) ;
return f ;
}
return null ;
}
public void put(Fruits fruit) {
this.fruit = fruit ;
synchronized(IMediator.class ) {
IMediator.fruits.add( fruit ) ;
}
}
}
package xx.study.design.mediator;
import java.util.HashMap;
import java.util.Map;
public class LuckyDraw {
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 xx.study.design.mediator;
public enum Fruits {
APPLE , BANANA , ORANGE , PEAR , GRAPE , PEACH
}
4 和代理模式区别?
代理是代理的对象,中介是行为被代理。