設計模式學習筆記——中介者(Mediator)模式

設計模式學習筆記——中介者(Mediator)模式

@(設計模式)[設計模式, 中介者模式, Mediator]

基本介紹

中介者模式一般用於調整多個對象之間的關係,當對象狀態改變時,將信息先傳遞給中介者,中介者進行處理,再反饋給相應的對象。

中介者案例

類圖

中介者案例類圖

實現代碼

Mediator接口

package com.pc.mediator.example;

/**
 * 中介者接口
 * Created by Switch on 2017/3/30.
 */
public interface Mediator {
    /**
     * 創建中介者管理成員
     */
    void createColleagues();

    /**
     * 成員狀態改變
     */
    void colleagueChanged();

}

Colleague接口

package com.pc.mediator.example;

/**
 * 成員接口
 * Created by Switch on 2017/3/30.
 */
public interface Colleague {
    /**
     * 設置中介者
     *
     * @param mediator 中介者對象
     */
    void setMediator(Mediator mediator);

    /**
     * 設置成員狀態
     *
     * @param enabled 啓用true,不啓用false
     */
    void setColleagueEnabled(boolean enabled);
}

ColleagueButton類

package com.pc.mediator.example;

import java.awt.Button;

/**
 * 按鈕成員類
 * Created by Switch on 2017/3/30.
 */
public class ColleagueButton extends Button implements Colleague {
    /**
     * 中介者
     */
    private Mediator mediator;

    /**
     * 構造方法,設置標題
     *
     * @param caption 標題
     */
    public ColleagueButton(String caption) {
        super(caption);
    }

    @Override
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    @Override
    public void setColleagueEnabled(boolean enabled) {
        setEnabled(enabled);
    }
}

ColleagueTextField類

package com.pc.mediator.example;

import java.awt.TextField;
import java.awt.Color;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;

/**
 * 文本域成員類
 * Created by Switch on 2017/3/30.
 */
public class ColleagueTextField extends TextField implements TextListener, Colleague {
    /**
     * 中介者
     */
    private Mediator mediator;

    /**
     * 構造方法,設置文本和字數
     *
     * @param text       文本
     * @param wordNumber 字數
     */
    public ColleagueTextField(String text, int wordNumber) {
        super(text, wordNumber);
    }

    @Override
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    @Override
    public void setColleagueEnabled(boolean enabled) {
        setEnabled(enabled);
        setBackground(enabled ? Color.white : Color.lightGray);
    }

    /**
     * 當文字發生變化時通知Mediator
     *
     * @param e 文本事件
     */
    @Override
    public void textValueChanged(TextEvent e) {
        mediator.colleagueChanged();
    }
}

ColleagueCheckbox類

package com.pc.mediator.example;

import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

/**
 * 複選框成員類
 * Created by Switch on 2017/3/30.
 */
public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {
    /**
     * 中介者
     */
    private Mediator mediator;

    /**
     * 構造方法,設置複選框標題、組、初始狀態
     *
     * @param caption 標題
     * @param group   組
     * @param state   初始狀態
     */
    public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) {
        super(caption, group, state);
    }

    @Override
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    @Override
    public void setColleagueEnabled(boolean enabled) {
        setEnabled(enabled);
    }

    /**
     * 當狀態發生變化時通知Mediator
     *
     * @param e 選項事件
     */
    @Override
    public void itemStateChanged(ItemEvent e) {
        mediator.colleagueChanged();
    }
}

LoginFrame類

package com.pc.mediator.example;

import java.awt.Frame;
import java.awt.Label;
import java.awt.GridLayout;
import java.awt.Color;
import java.awt.CheckboxGroup;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * 登錄界面類
 * Created by Switch on 2017/3/30.
 */
public class LoginFrame extends Frame implements ActionListener, Mediator {
    /**
     * 複選框:訪客
     */
    private ColleagueCheckbox checkGuest;
    /**
     * 複選框:用戶
     */
    private ColleagueCheckbox checkLogin;
    /**
     * 文本域:用戶名
     */
    private ColleagueTextField textUser;
    /**
     * 文本域:密碼
     */
    private ColleagueTextField textPass;
    /**
     * 按鈕:確定
     */
    private ColleagueButton buttonOk;
    /**
     * 按鈕:取消
     */
    private ColleagueButton buttonCancel;

    /**
     * 構造方法,設置標題
     *
     * @param title 標題
     */
    public LoginFrame(String title) {
        super(title);
        setBackground(Color.lightGray);
        // 使用佈局管理器生成4×2窗格
        setLayout(new GridLayout(4, 2));
        // 生成各個Colleague
        createColleagues();
        // 配置
        add(checkGuest);
        add(checkLogin);
        add(new Label("Username:"));
        add(textUser);
        add(new Label("Password:"));
        add(textPass);
        add(buttonOk);
        add(buttonCancel);
        // 設置初始的啓用起用/禁用狀態
        colleagueChanged();
        // 顯示
        pack();
        show();
    }

    @Override
    public void createColleagues() {
        // 生成
        CheckboxGroup g = new CheckboxGroup();
        checkGuest = new ColleagueCheckbox("Guest", g, true);
        checkLogin = new ColleagueCheckbox("Login", g, false);
        textUser = new ColleagueTextField("", 10);
        textPass = new ColleagueTextField("", 10);
        textPass.setEchoChar('*');
        buttonOk = new ColleagueButton("OK");
        buttonCancel = new ColleagueButton("Cancel");
        // 設置Mediator
        checkGuest.setMediator(this);
        checkLogin.setMediator(this);
        textUser.setMediator(this);
        textPass.setMediator(this);
        buttonOk.setMediator(this);
        buttonCancel.setMediator(this);
        // 設置Listener
        checkGuest.addItemListener(checkGuest);
        checkLogin.addItemListener(checkLogin);
        textUser.addTextListener(textUser);
        textPass.addTextListener(textPass);
        buttonOk.addActionListener(this);
        buttonCancel.addActionListener(this);
    }

    @Override
    public void colleagueChanged() {
        if (checkGuest.getState()) { // Guest mode
            textUser.setColleagueEnabled(false);
            textPass.setColleagueEnabled(false);
            buttonOk.setColleagueEnabled(true);
        } else { // Login mode
            textUser.setColleagueEnabled(true);
            userpassChanged();
        }
    }

    /**
     * 當textUser或是textPass文本輸入框中的文字發生變化時
     * 判斷各Colleage的啓用/禁用狀態
     */
    private void userpassChanged() {
        if (textUser.getText().length() > 0) {
            textPass.setColleagueEnabled(true);
            if (textPass.getText().length() > 0) {
                buttonOk.setColleagueEnabled(true);
            } else {
                buttonOk.setColleagueEnabled(false);
            }
        } else {
            textPass.setColleagueEnabled(false);
            buttonOk.setColleagueEnabled(false);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(e.toString());
        System.exit(0);
    }
}

測試類

package com.pc.mediator.example.test;

import com.pc.mediator.example.LoginFrame;
import org.junit.Test;

/**
 * LoginFrame Tester.
 *
 * @author Switch
 * @version 1.0
 */
public class LoginFrameTest {
    /**
     * 測試中介者模式
     *
     * @throws InterruptedException 中斷異常
     */
    @Test
    public void testLoginFrame() throws InterruptedException {
        new LoginFrame("Mediator Sample");
        Thread.sleep(100000);
    }

}

運行結果

這裏寫圖片描述

中介者模式中的角色

Mediator(仲裁者、中介者)

Mediator角色負責定義與Colleague角色進行通信和做出決定的接口(API)。在案例中,由Mediator接口扮演此角色。

ConcreteMediator(具體的仲裁者、中介者)

ConcreteMediator角色負責實現Mediator角色的接口(API),負責實際做出決定。在案例中,由LoginFrame類扮演此角色。

Colleague(同事)

Colleague角色負責定義與Mediator角色進行通信的接口(API)。在案例中,由Colleague接口扮演此角色。

ConcreteColleague (具體的同事)

ConcreteColleague角色負責實現Colleague角色的接口(API)。在案例中,由ColleagueButton類、ColleagueTextField類和ColleagueCheckbox類扮演此角色。

類圖

中介者模式類圖

GitHub:DesignPatternStudy

——————參考《圖解設計模式》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章