Mediator Design [중재자 디자인]
Design Object [디자인목적]
- 객체와 객체 사이의 관계가 강하여, 한 객체의 변경에 의해 다른 객체까지 변경되어야 할 경우, 중재자 객체를 두어 결합도를 낮추는 방법
- 객체와 객체간 결합도를 낮추어야 할 경우, 객체들 사이의 관계가 복잡할 경우, 객체사이에 중재자를 두어 객체의 결합도를 낮출때.
Options [대안들]
옵저버 패턴
파사드 패턴
Benefit [디자인 장점]
객체의 캡슐화를 강화 -> 결합도 저
[단점]중재자 객체가 신(God) 클래스가 될 수 있음.
Structure & Sample Code [구조와 샘플코드]
1) 데이터 선택에 따른 텍스트 박스 내용 변경
UML
구조
-> List의 내용에 따라 InputText 의 값을 바꾸는 구조
-> Mediator 없이 List 의 변화 시 바로 InputTex.value를 변경하면 간단하지만, 어플리케이션이 커질 경우, List의 변경에 의해 InputText가 변경되어야 할 가능성이 있음.
-> Screendirector 인터페이스 : Mediator의 인터페이스. 중재자가 가져야할 공통 함수를 갖는다.
-> ScreenDirectorOne 객체 : Screendirector 구현체. 중재할 InputText를 attribute로 갖고, InputText의 값을 셋팅.
-> InputText : List의 변화에 따라 Mediator를 거쳐 값이 변화
Source code
- Client
public class Client {
public static void main(String[] args) {
List list = new List();
InputText text = new InputText();
// Mediator
ScreenDirectorOne screendirector = new ScreenDirectorOne();
// Setting objects in mediator
screendirector.setInputText(text);
// Setting Mediator in objects
list.setScreendirector(screendirector);
list.getItems().add("Data item one");
list.getItems().add("Data item two");
list.getItems().add("Data item three");
list.selectItem(2);
System.out.println("Selected value is: "+text.getValue());
}
}
- List
import java.util.ArrayList;
public class List {
// List for save item data
private java.util.List<String> items = new ArrayList<String>();
// Mediator
private Screendirector screendirector;
// set value which will be input into InputText using mediator
public void selectItem(int itemNumber){
String item = items.get(itemNumber);
/**
* If mediator is not null, set value using mediator
*/
if(screendirector !=null){
screendirector.itemSelected(item);
}
}
public java.util.List<String> getItems() {
return items;
}
// Set proper mediator
public void setScreendirector(Screendirector screendirector) {
this.screendirector = screendirector;
}
}
- Screendirector : Interface
public interface Screendirector {
void itemSelected(String item);
}
- ScreendirectorOne
public class ScreenDirectorOne implements Screendirector{
private InputText inputText;
@Override
public void itemSelected(String item) {
inputText.setValue(item);
}
// Set input box which mediated by mediator
public void setInputText(InputText inputText) {
this.inputText = inputText;
}
}
- InputText
public class InputText {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}