박은종의 객체지향 설계를 위한 디자인패턴 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
'4차산업혁명의 일꾼 > Java&Spring웹개발과 서버 컴퓨터' 카테고리의 다른 글
스프링 부트의 정석 : 이번에도 남궁성과 끝까지 간다 1 (0) | 2023.03.06 |
---|---|
구조안을 돌아다니며 처리하는 패턴(Iterator, Vsitor, Chain of responsibility) (0) | 2023.03.06 |
(State, Observer, Memento:상태저장)상태를 클래스로 표현하여 관리하는 패턴 (0) | 2023.03.05 |
디자인패턴 5 : Adapter Pattern(호환) (0) | 2023.03.04 |
디자인패턴 4 동일시하기-equate : (Decorator)와 위임하기(Composite) (0) | 2023.03.03 |