设计模式(JAVA)——Mediator模式

1. Mediator模式

星型结构,有一个仲裁者,组员向仲裁者报告,由仲裁者向组员下达指示

1.1 Mediator模式的类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xExhXMgS-1574765323103)(./resources/image/16/16-1_Mediator.png)]

登场角色:

  • Mediator(仲裁者、中介者)
    定义了与Colleague角色进行通信和做出决定的接口

  • ConcreteMediator(具体的仲裁者、中介者)
    实现了仲裁者接口

  • Colleague(同事、组员)
    定义了与Mediator角色进行通信的接口

  • ConcreteColleague(具体的同事、组员)
    实现了组员接口

1.2 示例程序

类一览表

名字说明
Mediator仲裁者接口
Colleague组员接口
ColleagueButton表示按钮的类
ColleagueTextField表示文本输入框类
ColleagueCheckBox表示勾选框类
LoginFrame实现了仲裁者接口,显示登陆对话框
Main测试类

uml类图(只含实现关系)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9g81anET-1574765323104)(./resources/image/16/16-2.png)]

uml类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g45Ax8v7-1574765323106)(./resources/image/16/16-3.png)]

Mediator接口

package xin.ajay.mediator;

public interface Mediator {
    public abstract void createColleagues();
    public abstract void colleagueChanged();
}

Colleague接口

package xin.ajay.mediator;

public interface Colleague {
    public abstract void setMediator(Mediator mediator);
    public abstract void setColleagueEnabled(boolean enabled);
}

ColleagueButton类

package xin.ajay.mediator.impl;

import xin.ajay.mediator.Colleague;
import xin.ajay.mediator.Mediator;

import javax.swing.*;

public class ColleagueButton extends JButton implements Colleague {
    private Mediator mediator;

    public ColleagueButton(String text) {
        super(text);
    }

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

    //mediator下达启用/静止指示
    @Override
    public void setColleagueEnabled(boolean enabled) {
        setEnabled(true);
    }
}

ColleagueCheckBox类

package xin.ajay.mediator.impl;

import xin.ajay.mediator.Colleague;
import xin.ajay.mediator.Mediator;

import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {
    private Mediator mediator;

    public ColleagueCheckbox(String label, CheckboxGroup group, boolean state) throws HeadlessException {
        super(label, group, state);
    }

    //告诉mediator自己发生了改变
    @Override
    public void itemStateChanged(ItemEvent e) {
        mediator.colleagueChanged();
    }

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

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

ColleagueTextField类

package xin.ajay.mediator.impl;

import xin.ajay.mediator.Colleague;
import xin.ajay.mediator.Mediator;

import java.awt.*;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;

public class ColleagueTextField extends TextField implements TextListener, Colleague {
    private Mediator mediator;

    public ColleagueTextField(String text, int columns){
        super(text, columns);
    }

    @Override
    public void textValueChanged(TextEvent e) {
        mediator.colleagueChanged();
    }

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

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

LoginFrame类

package xin.ajay.mediator.ui;

import xin.ajay.mediator.Mediator;
import xin.ajay.mediator.impl.ColleagueButton;
import xin.ajay.mediator.impl.ColleagueCheckbox;
import xin.ajay.mediator.impl.ColleagueTextField;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class LoginFrame extends JFrame implements ActionListener, Mediator {
    private ColleagueCheckbox checkGuest;
    private ColleagueCheckbox checkLogin;
    private ColleagueTextField textUser;
    private ColleagueTextField textPass;
    private ColleagueButton buttonOK;
    private ColleagueButton buttonCancel;


    public LoginFrame(String title){
        super(title);

        setBackground(Color.lightGray);

        setLayout(new GridLayout(4,2));

        //创建同事
        createColleagues();

        add(checkGuest);
        add(checkLogin);

        add(new Label("Username:"));
        add(textUser);

        add(new Label("Password:"));
        add(textPass);

        add(buttonOK);
        add(buttonCancel);

        //设置初始状态
        colleagueChanged();
        pack();
        setVisible(true);
    }


    @Override
    public void createColleagues() {
        CheckboxGroup checkboxGroup = new CheckboxGroup();

        checkGuest = new ColleagueCheckbox("Guest", checkboxGroup, true);
        checkLogin = new ColleagueCheckbox("Login", checkboxGroup, false);

        this.textPass = new ColleagueTextField("", 10);
        this.textUser = new ColleagueTextField("", 10);
        textPass.setEchoChar('*');

        buttonOK = new ColleagueButton("OK");
        buttonCancel = new ColleagueButton("Cancel");

        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()){
            textUser.setColleagueEnabled(false);
            textPass.setColleagueEnabled(false);
            buttonOK.setColleagueEnabled(true);
        }else {
            textUser.setColleagueEnabled(true);
            userpassChanged();
        }
    }


    private void userpassChanged() {

        if(textUser.getText().length()>0) {
            textPass.setColleagueEnabled(true);
            if (textUser.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);
    }
}

Main类

package xin.ajay.mediator.ui;

public class Main {
    public static void main(String[] args) {
        new LoginFrame("Mediator Sample");
    }
}

###结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iw4mydGq-1574765323108)(./resources/image/16/16-4.png)]

鸣谢:

GoF《设计模式》和结城浩的《图解设计模式》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值