Observer pattern

Posted by yunki kim on October 1, 2021

  객체의 상태 변화를 관찰하는 옵저버(관찰자)들이 있고 이런 옵저버들의 목록을 객체에 등록해 상태 변화가 있을 때 마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 즉, 옵저버의 리스트를 가지고 있는 객체의 상태가 변하면 옵저버를 통해 객체들에게 알림을 보낸다. 

1
2
3
interface Listener{
    void actionPerformed();
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
class ButtonActionListener implements Listener{
    private Button myButton;
 
    @Override
    public void actionPerformed(){
        System.out.println(this.myButton.getTitle() + "버튼 클릭됨");
    }
 
    public void setButton(Button b) {
        myButton = b;
    }
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Button {
    private String title;
    private ButtonActionListener myListener;
    public Button(String t) {
        title = t;
    }
 
    public String getTitle() {
        return title;
    }
 
    public void addListener(ButtonActionListener l) {
        this.myListener = l;
        this.myListener.setButton(this);
    }
    public void click() {  // 콜백 함수
        // 여기서 리스너를 호출한다.
        myListener.actionPerformed();
    }
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
 
    public static void main(String[] args) {
 
        Button fileButton = new Button("File");
        fileButton.addListener(new ButtonActionListener());
        fileButton.click();
        Button editButton = new Button("Edit");
        editButton.addListener(new ButtonActionListener());
        editButton.click();
    }
 
}
cs