倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

「GoF デザインパターン」アノテーション (17) : Mediator パターン

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

増補改訂版Java言語で学ぶデザインパターン入門 オブジェクト指向における再利用のためのデザインパターン Code Complete第2版〈上〉―完全なプログラミングを目指して Code Complete第2版〈下〉―完全なプログラミングを目指して