[Mode] Mediator mode illustrated design

Team members report to the arbitrator, the arbitrator issued instructions to the crew. No longer ask each other and each other instructions between team members.

Examples

A GUI application that shows a login dialog, after which the user enter the correct user name and password to log in.

  • You can choose as a tourist visit (Guest) or as user login (Login)
  • As users log in, you need to enter the correct user name (Username) and password (Password)
  • Click the OK button to log in, click on the Cancel button to cancel Login

Class Diagram

m6AocQ.png

Timing diagram

m6EZ9O.png

Mediator Interface

1
2
3
4
public  interface   { public abstract void createColleagues () ; public abstract void colleagueChanged () ; }



Colleague Interface

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

ColleagueButton类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.awt.*;

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

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


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


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

ColleagueTextField类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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);
}


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


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


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

ColleagueCheckbox类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 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);
}

@Override
public void itemStateChanged(ItemEvent e) {
mediator.colleagueChanged();
}
}

LoginFrame类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class LoginFrame extends Frame implements ActionListener, {
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();
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");

checkGuest.setMediator(this);
checkLogin.setMediator(this);
textUser.setMediator(this);
textPass.setMediator(this);
buttonOk.setMediator(this);
buttonCancel.setMediator(this);

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 (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);
}
}

Main类

1
2
3
4
5
6
public class Main {

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

运行结果

m6BnxO.png

m6B8II.png

m6BNz8.png

m6Bron.png

m6B6J0.png

登场角色

Mediator(仲裁者、中介者)

Mediator角色负责定义与Colleague角色进行通信和做出决定的接口(API)。在示例程序中,由Mediator接口扮演此角色。

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

ConcreteMediator角色负责实现Mediator角色的接口(API),负责实际做出决定。在示例程序中,由LoginFrame类扮演此角色。

Colleague(同事)

Colleague and Mediator role responsible for defining the role of interface (API) for communication. In the sample program, the Colleague interfaces play this role.

ConcreteColleague (specific colleagues)

ConcreteColleague role is responsible for implementing Colleague roles Interface (API). In the sample program, the ColleagueButton class, ColleagueTextField ColleagueCheckbox class and class play this role.

Class Diagram

m6sdsO.png

Original: Big Box  [graphic design] Mediator pattern mode


Guess you like

Origin www.cnblogs.com/chinatrump/p/11584628.html