1. 程式人生 > 實用技巧 >java23種設計模式-行為型模式-中介者模式

java23種設計模式-行為型模式-中介者模式

一、定義

中介者(Mediator)模式的定義:定義一箇中介物件來封裝一系列物件之間的互動,使原有物件之間的耦合鬆散,且可以獨立地改變它們之間的互動。中介者模式又叫調停模式,它是迪米特法則的典型應用。

二、優點及缺點

優點:

1、類之間各司其職,符合迪米特法則。

2、降低了物件之間的耦合性,使得物件易於獨立地被複用。

3、將物件間的一對多關聯轉變為一對一的關聯,提高系統的靈活性,使得系統易於維護和擴充套件。

缺點:

1、中介者模式將原本多個物件直接的相互依賴變成了中介者和多個同事類的依賴關係。當同事類越多時,中介者就會越臃腫,變得複雜且難以維護。

三、程式碼實現:

抽象中介者類:

package
com.example.demo.sjms.zhongjiezhemoshi; import java.util.ArrayList; import java.util.List; /** * @Author: caesar * @Date:2020年12月21日 17:12:45 * @Description: 抽象中介者 */ public abstract class Mediator { // 同事類的集合 protected List<Colleague> colleagueList; public Mediator(){ this
.colleagueList = new ArrayList<Colleague>(); } /** * @Author: caesar * @Date:2020年12月21日 17:12:14 * @Description: 註冊方法 */ public abstract void register(Colleague colleague); /** * @Author: caesar * @Date:2020年12月21日 17:12:33 * @Description: 通知方法
*/ public abstract void relay(Colleague colleague); }

具體中介者類:

package com.example.demo.sjms.zhongjiezhemoshi;

/**
 *  @Author: caesar
 *  @Date:2020年12月21日 17:12:22
 *  @Description: 具體中介者
 */
public class ConcreteMediator extends Mediator{
    /**
     *  @Author: caesar
     *  @Date:2020年12月21日 17:12:14
     *  @Description: 註冊方法
     */
    @Override
    public void register(Colleague colleague) {
            if(!super.colleagueList.contains(colleague)){
                colleague.setMediator(this);
                super.colleagueList.add(colleague);
            }

    }

    /**
     *  @Author: caesar
     *  @Date:2020年12月21日 17:12:33
     *  @Description: 通知方法
     */
    @Override
    public void relay(Colleague colleague) {
        super.colleagueList.forEach(x -> {
            if(!colleague.equals(x)){
                x.receive();
            }
        });
    }
}

抽象同事類:

package com.example.demo.sjms.zhongjiezhemoshi;

/**
 *  @Author: caesar
 *  @Date:2020年12月21日 17:12:54
 *  @Description: 抽象同事類
 */
public abstract class Colleague {
    // 中介者
    protected Mediator mediator;
    // 設定中介者
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
    // 傳送方法
    public abstract void send();
    // 接收方法
    public abstract void receive();

}

具體同事類:

package com.example.demo.sjms.zhongjiezhemoshi;

/**
 *  @Author: caesar
 *  @Date:2020年12月21日 17:12:03
 *  @Description: 具體同事類
 */
public class ConcreteColleagueA extends Colleague{

/**
 *  @Author: caesar
 *  @Date:2020年12月21日 17:12:27
 *  @Description: 傳送方法
 */
    @Override
    public void send() {
        System.out.println("A開始傳送資訊。。。。。。。");
        super.mediator.relay(this);
    }

    /**
     *  @Author: caesar
     *  @Date:2020年12月21日 17:12:35
     *  @Description: 接收方法
     */
    @Override
    public void receive() {
        System.out.println("A收到通知。。。。。。");
    }
}

package com.example.demo.sjms.zhongjiezhemoshi;

/**
 *  @Author: caesar
 *  @Date:2020年12月21日 17:12:03
 *  @Description: 具體同事類
 */
public class ConcreteColleagueB extends Colleague{

/**
 *  @Author: caesar
 *  @Date:2020年12月21日 17:12:27
 *  @Description: 傳送方法
 */
    @Override
    public void send() {
        System.out.println("B開始傳送資訊。。。。。。。");
        super.mediator.relay(this);
    }

    /**
     *  @Author: caesar
     *  @Date:2020年12月21日 17:12:35
     *  @Description: 接收方法
     */
    @Override
    public void receive() {
        System.out.println("B收到通知。。。。。。");
    }
}

package com.example.demo.sjms.zhongjiezhemoshi;

/**
 *  @Author: caesar
 *  @Date:2020年12月21日 17:12:03
 *  @Description: 具體同事類
 */
public class ConcreteColleagueC extends Colleague{

/**
 *  @Author: caesar
 *  @Date:2020年12月21日 17:12:27
 *  @Description: 傳送方法
 */
    @Override
    public void send() {
        System.out.println("C開始傳送資訊。。。。。。。");
        super.mediator.relay(this);
    }

    /**
     *  @Author: caesar
     *  @Date:2020年12月21日 17:12:35
     *  @Description: 接收方法
     */
    @Override
    public void receive() {
        System.out.println("C收到通知。。。。。。");
    }
}

測試類:

package com.example.demo.sjms.zhongjiezhemoshi;

/**
 *  @Author: caesar
 *  @Date:2020年12月21日 17:12:17
 *  @Description: 測試類
 */
public class Test {
    public static void main(String[] args) {
        // 建立中介者
        ConcreteMediator concreteMediator = new ConcreteMediator();
        // 建立同事類
        ConcreteColleagueA concreteColleagueA = new ConcreteColleagueA();
        ConcreteColleagueB concreteColleagueB = new ConcreteColleagueB();
        ConcreteColleagueC concreteColleagueC = new ConcreteColleagueC();
        concreteMediator.register(concreteColleagueA);
        concreteMediator.register(concreteColleagueB);
        concreteMediator.register(concreteColleagueC);
        concreteColleagueA.send();
        concreteColleagueB.send();
        concreteColleagueC.send();
    }
}

四、原始碼級別

五、總結

主要解決:當物件之間存在複雜的網狀結構關係而導致依賴關係混亂且難以複用時。