The essence of the Mediator Pattern is to “define an object that encapsulates how a set of objects interact “. It promotes loose coupling by keeping objects from referring to each other explicitly, and it allows their interaction to be varied independently. Client classes can use the mediator to send messages to other clients, and can receive messages from other clients via an event on the mediator class.Mediator - defines the interface for communication between Colleague objectsConcreteMediator - implements the Mediator interface and coordinates communication between Colleague objects. It is aware of all of the Colleagues and their purposes with regards to inter-communication.Colleague - defines the interface for communication with other ColleaguesConcreteColleague - implements the Colleague interface and communicates with other Colleagues through its Mediator
“中介者模式”:把对象(A)与对象(B)之间的__直接__通信关系,变成对象(A)与对象(B)通过__中介对象__来通信的__间接__关系,从而松散了对象(A)与对象(B)的耦合度;实现上必须“__你中有我,我中有你__”。(PS:如果参与通信的对象很多的话就会增加中介对象的复杂度。)
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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;interface Command { void execute () ; } interface Mediator { void book () ; void view () ; void search () ; void registerView (BtnView v) ; void registerSearch (BtnSearch s) ; void registerBook (BtnBook b) ; void registerDisplay (LblDisplay d) ; } class ParticipantMediator implements Mediator { BtnView btnView; BtnSearch btnSearch; BtnBook btnBook; LblDisplay show; public void registerView (BtnView v) { btnView = v; } public void registerSearch (BtnSearch s) { btnSearch = s; } public void registerBook (BtnBook b) { btnBook = b; } public void registerDisplay (LblDisplay d) { show = d; } public void book () { btnBook.setEnabled(false ); btnView.setEnabled(true ); btnSearch.setEnabled(true ); show.setText("booking..." ); } public void view () { btnView.setEnabled(false ); btnSearch.setEnabled(true ); btnBook.setEnabled(true ); show.setText("viewing..." ); } public void search () { btnSearch.setEnabled(false ); btnView.setEnabled(true ); btnBook.setEnabled(true ); show.setText("searching..." ); } } class BtnView extends JButton implements Command { Mediator med; BtnView(ActionListener al, Mediator m) { super ("View" ); addActionListener(al); med = m; med.registerView(this ); } public void execute () { med.view(); } } class BtnSearch extends JButton implements Command { Mediator med; BtnSearch(ActionListener al, Mediator m) { super ("Search" ); addActionListener(al); med = m; med.registerSearch(this ); } public void execute () { med.search(); } } class BtnBook extends JButton implements Command { Mediator med; BtnBook(ActionListener al, Mediator m) { super ("Book" ); addActionListener(al); med = m; med.registerBook(this ); } public void execute () { med.book(); } } class LblDisplay extends JLabel { Mediator med; LblDisplay(Mediator m) { super ("Just start..." ); med = m; med.registerDisplay(this ); setFont(new Font("Arial" , Font.BOLD, 24 )); } } class MediatorDemo extends JFrame implements ActionListener { Mediator med = new ParticipantMediator(); MediatorDemo() { JPanel p = new JPanel(); p.add(new BtnView(this , med)); p.add(new BtnBook(this , med)); p.add(new BtnSearch(this , med)); getContentPane().add(new LblDisplay(med), "North" ); getContentPane().add(p, "South" ); setSize(400 , 200 ); setVisible(true ); } public void actionPerformed (ActionEvent ae) { Command comd = (Command) ae.getSource(); comd.execute(); } public static void main (String[] args) { new MediatorDemo(); } }