X.d 笔记

小Web,大世界

0%

设计模式(17):调停者模式 Mediator

一般称中介者模式会更好会意一点,就是那个收集信息,然后搞介绍再收服务费的那玩意。

调停者模式 Mediator

题义:调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

问题:

We want to design reusable components, but dependencies between the potentially reusable pieces demonstrates the “spaghetti code” phenomenon (trying to scoop a single serving results in an “all or nothing clump”).

意图:

  • 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.
  • Design an intermediary to decouple many peers.
  • Promote the many-to-many relationships between interacting peers to “full object status”.

代码

例:名字叫中介者,听起来和代理倒是有些相近,但一般场景下,代码是两方不可访问,而中介并不是,只是方便两方访问,比如QQ软件,我给你发消息,你又给我加消息,QQ就相当于一个中介。

代码1:QQ服务器

import java.util.ArrayList;
import java.util.List;
/**
 * @author xdnote.com
 * */
public class Mediator {

    public static List<Member> onlineMembers = new ArrayList<Member>();

    public static void login(Member member){
        System.out.println(member.getName()+"上线了");
        onlineMembers.add(member);
    }

    public static void storeMessage(String message, Member form, Member to){
        to.resive(message, form);
    }
}

代码2:QQ会员

public class Member {

    private String name;

    public String getName() {
        return name;
    }
    public Member(String name) {
        super();
        this.name = name;
        Mediator.login(this);
    }
    //发送消息
    public void send(String str,Member member){
        Mediator.storeMessage(str, this, member);
    };

    //收到消息
    public void resive(String str,Member member){
        System.out.println("用户 "+this.getName()+"的窗口上:"+"收到来自 "+member.getName()+" 的消息:" + str);
    };
}

代码3:客户端调用

public class Client {
    public static void main(String[] args){
        Member m1 = new Member("m1");
        Member m2 = new Member("m2");
        m1.send("发你个消息", m2);
        m2.send("回你个消息", m1);
        Member m3 = new Member("m3");
        m1.send("给m3发个信息", m2);
        m1.send("发你个消息", m3);
        m2.send("发你个消息", m3);
    }
}

小结

调停者模式(中介者模式) Mediator

  • 使用频率:
    如果代码功能不算太专业,一般在业务逻辑中就直接写了,不会专门写个模式来弄。

  • 利弊影响:
    用的比较少,暂不评价。