4차산업혁명의 일꾼/Java&Spring웹개발과 서버 컴퓨터

복잡한 연결을 단순하고 간단하게 처리하는 패턴(Facade, Mediator)

르무엘 2023. 3. 6. 01:41

박은종의 객체지향 설계를 위한 디자인패턴 with 자바

 

Facade Pattern 이란?

  • 간단한 창구
  • 서브시스템이 여러개인 경우 이를 통합한 하나의 인터페이스를 제공
  • 서브시스템을 좀 더 편하게 이용하기 위한 높은 수준의 인터페이스를 정의
  • 각 서브시스템의 역할이나 의존관계를 내부에서 올바를 순서로 사용할 수 있도록 외부에는 간단한 인터페이스만을 오픈
  • Facade : 하나의 일관된 인터페이스 제공 (ex : 컴파일러)

  • 복잡한 서브시스템들에 대한 단순하고 기본적인 인터페이스를 앞에서 제공
  • 클라이언트와 서브시스템간의 결합도를 줄임

Mediator Pattern

 

  • 객체간의 상호 작용을 하나의 객체에서 캡슐화하여 처리
  • UI 프로그래밍에서 많이 사용되는 방법으로 Widget 간의 상호 처리를 서로간에 처리하는 것이 아닌 한 객체가 전담하여 처리하도록 하는 방식
  • 객체 서로간의 메세지를 전달할 일이 있을 때도 중재자를 두고 전달할 수 있음
  • N:N의 관계를 1:N의 관계로 바꿀 수 있음 (counselor)

 

  • Mediator : Colleague 객체와 교류하는데 필요한 인터페이스를 정의
  • ConcreteMediator : Colleague간의 이루어지는 협력을 구현하고, 자신의 Colleague들을 관리
  • Colleague : Mediator의 참조자를 가지고 있고, 다른 객체와의 협력이 필요할때 Mediator에게 알림

 

package com.backend.bakckend.designpattern.simple;

import java.awt.*;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.TextListener;


interface Mediator {
    void createColleagues();

    void colleagueChanged();
}

interface Colleague {
    void setMediator(Mediator mediator);

    void setColleagueEnabled(boolean enabled);
}

class ColleagueButton extends java.awt.Button implements Colleague {
    private Mediator mediator;

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

    public void setMediator(Mediator mediator) {          // Mediator를 저장
        this.mediator = mediator;
    }

    public void setColleagueEnabled(boolean enabled) {    // Mediator로부터 Colleague의 enable/disable을 요청받음
        setEnabled(enabled);
    }
}

class ColleagueTextField extends TextField implements Colleague, TextListener {
    private Mediator mediator;

    public ColleagueTextField(String text, int columns) {
        super(text, columns);
    }

    public void setMediator(Mediator mediator) {          // Mediator를 저장
        this.mediator = mediator;
    }

    public void setColleagueEnabled(boolean enabled) {    // Colleague의 enable/disable을 직접 처리
        setEnabled(enabled);
        setBackground(enabled ? java.awt.Color.white : java.awt.Color.lightGray);
    }

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

class ColleagueCheckbox extends Checkbox implements Colleague, java.awt.event.ItemListener {
    private Mediator mediator;

    public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) {
        super(caption, group, state);
    }

    public void setMediator(Mediator mediator) {          // Mediator를 저장
        this.mediator = mediator;
    }

    public void setColleagueEnabled(boolean enabled) {    // Colleague의 enable/disable을 직접 처리
        setEnabled(enabled);
    }

    public void itemStateChanged(java.awt.event.ItemEvent e) {
        mediator.colleagueChanged();
    }
}

class ColleagueLabel extends java.awt.Label implements Colleague {
    private Mediator mediator;

    public ColleagueLabel(String caption, int alignment) {
        super(caption, alignment);
    }

    public void setMediator(Mediator mediator) {          // Mediator를 저장
        this.mediator = mediator;
    }

    public void setColleagueEnabled(boolean enabled) {    // Colleague의 enable/disable을 직접 처리
        // do nothing
    }
}

class LoginFrame extends Frame implements ActionListener, Mediator {
    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(java.awt.Color.lightGray);
        setLayout(new java.awt.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(checkGuest);
        pack();
        show();
    }


    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");
        // Mediator의 설정
        checkGuest.setMediator(this);
        checkLogin.setMediator(this);
        textUser.setMediator(this);
        textPass.setMediator(this);
        buttonOk.setMediator(this);
        buttonCancel.setMediator(this);
        // Listener
        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()) {                // Guest mode
            textUser.setColleagueEnabled(false);
            textPass.setColleagueEnabled(false);
            buttonOk.setColleagueEnabled(true);
        } else {                                    // Login mode
            textUser.setColleagueEnabled(true);
            userpassChanged();
        }
    }

    public void colleagueChanged(Colleague c) {
        if (c == checkGuest || c == checkLogin) {
            if (checkGuest.getState()) {
                textUser.setColleagueEnabled(false);
                textPass.setColleagueEnabled(false);
                buttonOk.setColleagueEnabled(true);
            } else {
                textUser.setColleagueEnabled(true);
                userpassChanged();
            }
        } else if (c == textUser || c == textPass) {
            userpassChanged();
        } else {
            System.out.println("colleagueChanged:unknown colleague = " + c);
        }
    }

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

    public void actionPerformed(ActionEvent e) {
        System.out.println("" + e.toString());
        System.exit(0);
    }



}

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

}
LIST