今回は Mediator パターン(一覧)。
Mediator パターンの登場人物
- @Mediator → 型
- colleagueType : Class<?>
- @CreateColleagues → メソッド
- @ColleagueChanged → メソッド
- @ConcreteMediator → 具象クラス
- mediatorType : Class<?>
- @ColleagueInstance → フィールド
- @Colleague → 型
- mediatorType : Class<?>
- @MediatorInstance → フィールド
- @SetMediator → メソッド
- @ControlColleague → メソッド
- @ConcreteColleague → 具象クラス
- colleagueType : Class<?>
アノテーション定義
上記の定義の具体的な Java コード。
package org.waman.tools.design.gof.behavioral; import java.lang.annotation.*; public final class MediatorPattern { private MediatorPattern(){} @Target(ElementType.TYPE) public static @interface Mediator{ Class<?> colleagueType() default Void.class; @Inherited @Target(ElementType.METHOD) public static @interface CreateColleagues{} @Inherited @Target(ElementType.METHOD) public static @interface ColleagueChanged{} } @Target(ElementType.TYPE) public static @interface ConcreteMediator{ Class<?> mediatorType() default Void.class; @Inherited @Target(ElementType.FIELD) public static @interface ColleagueInstance{} } @Target(ElementType.TYPE) public static @interface Colleague{ Class<?> mediatorType() default Void.class; @Inherited @Target(ElementType.FIELD) public static @interface MediatorInstance{} @Inherited @Target(ElementType.METHOD) public static @interface SetMediator{} @Inherited @Target(ElementType.METHOD) public static @interface ControlColleague{} } @Target(ElementType.TYPE) public static @interface ConcreteColleague{ Class<?> colleagueType() default Void.class; } }
サンプルコード in 『Java 言語で学ぶデザインパターン入門』
Mediator.java
@Mediator 役のインターフェース。
import org.waman.tools.design.gof.behavioral.MediatorPattern; import org.waman.tools.design.gof.behavioral.MediatorPattern.Mediator.ColleagueChanged; import org.waman.tools.design.gof.behavioral.MediatorPattern.Mediator.CreateColleagues; @MediatorPattern.Mediator(colleagueType = Colleague.class) public interface Mediator { @CreateColleagues public abstract void createColleagues(); @ColleagueChanged public abstract void colleagueChanged(); }
LoginFrame.java
@ConcreteMediator 役の具象クラス。
import java.awt.*; import java.awt.event.*; import org.waman.tools.design.gof.behavioral.MediatorPattern; import org.waman.tools.design.gof.behavioral.MediatorPattern.ConcreteMediator.ColleagueInstance; @MediatorPattern.ConcreteMediator(mediatorType = Mediator.class) public class LoginFrame extends Frame implements ActionListener, Mediator { private static final long serialVersionUID = -7914753823897043206L; @ColleagueInstance private ColleagueCheckbox checkGuest; @ColleagueInstance private ColleagueCheckbox checkLogin; ... public LoginFrame(String title) { super(title); setBackground(Color.lightGray); setLayout(new GridLayout(4, 2)); createColleagues(); add(checkGuest); add(checkLogin); ... colleagueChanged(); pack(); setVisible(true); } @Override public void createColleagues() { CheckboxGroup g = new CheckboxGroup(); checkGuest = new ColleagueCheckbox("Guest", g, true); checkLogin = new ColleagueCheckbox("Login", g, false); ... } @Override public void colleagueChanged() {...} ... @Override public void actionPerformed(ActionEvent e) {...} }
『Java 言語で学ぶデザインパターン入門』には、@ColleagueInstance を付加するフィールドが他に幾つか定義されていますが、ここでは省略。
Colleague.java
@Colleague 役のインターフェース。
import org.waman.tools.design.gof.behavioral.MediatorPattern; import org.waman.tools.design.gof.behavioral.MediatorPattern.Colleague.SetMediator; import org.waman.tools.design.gof.behavioral.MediatorPattern.Mediator.ColleagueChanged; @MediatorPattern.Colleague(mediatorType = Mediator.class) public interface Colleague { @SetMediator public abstract void setMediator(Mediator mediator); @ColleagueChanged public abstract void setColleagueEnabled(boolean enabled); }
ColleagueCheckbox.java
@ConcreteColleague 役の具象クラス。 『Java 言語で学ぶデザインパターン入門』には、他にも @ConcreteColleague 役のクラスが定義されていますが、ここでは省略。
import java.awt.*; import java.awt.event.*; import org.waman.tools.design.gof.behavioral.MediatorPattern; import org.waman.tools.design.gof.behavioral.MediatorPattern.Colleague.MediatorInstance; @MediatorPattern.ConcreteColleague(colleagueType = Colleague.class) public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague { private static final long serialVersionUID = 4305501298141978061L; @MediatorInstance private Mediator mediator; ... @Override public void setMediator(Mediator mediator) { this.mediator = mediator; } @Override public void itemStateChanged(ItemEvent e) { mediator.colleagueChanged(); } }