Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 다이나믹 프로그래밍
- 언어의 온도
- Segment Tree
- DP
- 성화봉송
- 위상정렬
- 창훈쓰다
- 영어회화 100일의 기적
- 다음 API
- BOJ 2098
- 이분탐색
- upper_bound
- 삼성 코딩테스트
- boj
- 평창동계올림픽
- yolo
- 캘리그라피
- 성화봉송주자
- 안드로이드 스튜디오
- 다음 지도 api
- 백트레킹
- 그리디 알고리즘
- multiset
- lower_bound
- 비트마스크
- 외판원 순회
- BFS
- 생활코딩
- MST
- 인간이 그리는 무늬
Archives
- Today
- Total
Hoon222y
[1227-2] 옵저버 패턴 본문
옵저버 패턴 : 객체의 상태 변화를 관찰하고 이를 처리하기 위한 디자인 패턴이다. 이벤트가 발생될 객체에 옵저버 객체들을 등록하고, 상태변화가 있을때마다 메서드 등을 통해 객체가 등록된 옵저버들의 메서드를 호출하여 옵저버에게 알려준다 .
옵저버 패턴 : 객체의 상태 변화를 관찰하려는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버들에게 통지하도록 하는 디자인 패턴
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | package Observer; import java.util.ArrayList; public class main { public static void main(String[] args) { Button closeBtn = new Button("닫기"); //버튼이 눌릴 경우, 내부적으로 아래의 메서드가 호출됩니다. //이처럼 누군가에 의해 호출당하는 개념을 콜백(callback)이라고 한다. closeBtn.click(); } } class Button{ private String label; public Button(String label) {this.label = label;} public void click() { //이 메서드 안에서 버튼이 클릭되었을 때의 이벤트를 처리하면 됩니다. System.out.println("다이얼로그가 닫힙니다."); } } public class main { public static void main(String[] args) { CloseButton closeBtn = new CloseButton("닫기"); closeBtn.click(); } } class Button{ protected String label; public Button(String label) {this.label = label;} // 현재 버튼은 이미 라이브러리로 구현되어 있어 수정될 수 없으므로 // 사용자는 버튼의 콜백 메서드에 처리 코드를 구현할 수 없습니다. public void click() {} } //이제 버튼에 대한 콜백을 구현하기 위해 기존 버튼을 상속하여 구현한다. class CloseButton extends Button{ public CloseButton(String label) {super(label);} public void click() { System.out.println("다이얼로그가 닫힙니다."); } } | cs |
콜백(callback) : 누군가에 의해 호출당하는 개념
하지만 이 코드는 이벤트 처리를 위해 상속을 사용하였다. 버튼의 경우, 이미 라이브러리 안에 있으므로 사용자가 이를 직접 사용할 수 없기 때문이다. 따라서 이를 해결하기 위해 이벤트 버튼이 직접 처리하는것이 아니라 옵저버를 통해 외부에 알리는 방식으로 해결할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | package Observer; import java.util.ArrayList; public class main { public static void main(String[] args) { Button closeBtn = new Button("닫기"); closeBtn.setOnClickListener(new OnClickListener() { public void onClick() { System.out.println("윈도우가 닫힙니다."); } }); closeBtn.click(); } } // 외부에 알리기 위해 추상 클래스와 인터페이스를 사용할수 있는데 이 때, 인터페이스 기반으로 // 구현하는것이 좋습니다. interface OnClickListener{ public void onClick(); } // 만약 이벤트를 처리하는 핸들러가 재사용할 것이라면 아래와 같이 클래스로 // 구현해도 됩니다. 하지만 특정 이벤트처리만 수행할 것이라면 아래와 같이 클래스를 // 설계하는것은 일종의 낭비이다. class OnClickListenerImpl implements OnClickListener{ @Override public void onClick() { } } class Button { protected String label; private OnClickListener listener = null; // private ArrayList<OnClickListener> list = new ArrayList<>(); // 이렇게 하면 여러개 객체에 대해서 통제가능 / 내부적으로 객체를 여러개 public Button(String label) {this.label = label;} public void setOnClickListener(OnClickListener l) { listener=l; //list.add(l); } public void click() { // 이제 이벤트가 발생하면 외부에 알리도록 합니다. if(listener != null)listener.onClick(); } } | cs |
'코딩 > 교육' 카테고리의 다른 글
[1226-2] 컴포지트 패턴 (0) | 2018.12.27 |
---|---|
[1227-3] 디자인 패턴 / 리팩토링 (0) | 2018.12.27 |
[1227-1] 어댑터 패턴 / 팩토리 메서드 패턴 (0) | 2018.12.27 |
[1226-1] 추상화 / 인터페이스 /강결합/약결합/ (1) | 2018.12.26 |
[1220-5] 상속 / 오버라이딩 / 바인딩 / 업케스팅 (0) | 2018.12.20 |
Comments