2010年4月27日 星期二

Design Pattern : 16 Mediator

Mediator的角色,通常都是當作UIComponent的代理人
UIComponent是使用者會直接接觸到的元件
如Button,TextField等,當我們在操作這些UIComponent
UIComponent 只是用來當作View顯示,而不做邏輯處理
也就是說,當接收到使用者的指令,如按鈕,輸入文字..
會把這些事件丟出去,往外通知
UIComponent..只是單純被操作
事件丟出的方式,可以是用dispatchEvent方式廣播
或是通知mediatior來處理
而Mediator的角色,就是主程式與UIComponent間的橋樑

參與者
1.Mediator 介面
createColleagus:利用這method把所有的UIComponent登錄到Mediator上
colleagusChanged:當有登錄的UIComponent狀態改變時都會呼叫這method
通知mediator作處理

public interface Mediator {
    public abstract void createColleagus();
    public abstract void colleagusChanged(Colleagus colleagus);
}

2.Colleagus
所有的UIComponent都implement這介面,讓UIComponent都有可以跟
mediator溝通的共同method
setColleagusEnabled:要改變UComponent不要直接去操作到UIComponent,
而是透過一個public API去操作


public interface Colleagus {
    public abstract void setMediator(Mediator mediator);
    public abstract void setColleagusEnabled(boolean enabled);
}

3.ColleagusTextField 實作的Colleagus
本身是TextField,同時也以自己當作TextListener
textValueChanged:當TextEvent被觸發時會執行這method
在這method中通知mediator

public class ColleagusTextField extends TextField implements Colleagus,TextListener{
    private Mediator mediator;
    public ColleagusTextField(String text,int columns){
        super(text,columns);
    }
    @Override
    public void setColleagusEnabled(boolean enabled) {       
        setEnabled(enabled);
        setBackground(enabled?Color.white:Color.gray);
    }
    @Override
    public void setMediator(Mediator mediator) {       
        this.mediator=mediator;
    }
    @Override
    public void textValueChanged(TextEvent arg0) {       
        this.mediator.colleagusChanged(this);
    }
}

4.LoginFrame 實作的Mediator

public class LoginFrame extends Frame implements Mediator,ActionListener{
    private ColleagusTextField textUser;
    public LoginFrame(String title){
        super(title);
        setBackground(Color.lightGray);
        setLayout(new GridLayout(4,2));       
        createColleagus();
        add(textUser);
        pack();
        setVisible(true);       
    }
    @Override
    public void colleagusChanged(Colleagus c) {
       
    }
    @Override
    public void createColleagus() {
        textUser=new ColleagusTextField("input user name",10);
        textUser.setMediator(this);
        textUser.addTextListener(textUser);   
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
           
    }
}

5.Main 外部程式

new LoginFrame("Main Frame");


沒有留言: