设计模式之 Mediator(中介者)通俗理解

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 和代理模式区别?

代理是代理的对象,中介是行为被代理。

猜你喜欢

转载自blog.csdn.net/h4241778/article/details/107585108