中介者模式

模式介绍

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

模式优点

1、简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变为松耦合。
2、提供系统的灵活性,使得各个同事对象独立而易于复用。

模式缺点

1、中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。
2、新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。

使用场景

1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

系统建模

1、利用中介者模式,实现市场的买卖交易系统。
2、系统中涉及市场,买家,卖家。

系统实现

/**
 * 交易者抽象类
 */
public abstract class Participant {
    protected Mediary mediary;

    void sendMessage(String message) {}
}
/**
 * 卖方
 */
public class Solder extends Participant {
    public Solder(Mediary mediary) {
        this.mediary = mediary;
    }

    @Override
    void sendMessage(String message) {
        super.sendMessage(message);
        this.mediary.sendMessage(message,this);
    }
}
/**
 * 买方
 */
public class Buyer extends Participant {
    public Buyer(Mediary mediary) {
        this.mediary = mediary;
    }

    @Override
    void sendMessage(String message) {
        super.sendMessage(message);
        this.mediary.sendMessage(message,this);
    }
}
/**
 * 中介者抽象类
 */
public abstract class Mediary {
    void sendMessage(String message,Participant participant) {}
}
/**
 * 中介者类
 */
public class Market extends Mediary {
    private Participant buyer;
    private Participant solder;

    public void setBuyer(Participant buyer) {
        this.buyer = buyer;
    }

    public void setSolder(Participant solder) {
        this.solder = solder;
    }

    @Override
    void sendMessage(String message,Participant participant) {
        super.sendMessage(message,participant);
        if (participant == buyer) {
            System.out.println("卖家:" + message);
        } else {
            System.out.println("买家:" + message);
        }
    }
}
/**
 * 客户端
 */
public class Client{
    public static void main(String[] args) {
        Market market = new Market();
        Solder solder = new Solder(market);
        Buyer buyer = new Buyer(market);
        market.setBuyer(buyer);
        market.setSolder(solder);
        solder.sendMessage("大哥,要盘吗?");
        buyer.sendMessage("滚!");
    }
}
结果:
买家:大哥,要盘吗?
卖家:滚!
原文地址:https://www.cnblogs.com/feiqiangsheng/p/12239962.html