Observer Pattern
- 관찰자(Observer), 대상자(Subject)
Subject 에서 Observer에 데이터를 전달하는 2가지 방식
1. Push -> Subject가 Observer에게 전달하는 방식
2. Pull -> Observer가 Subject로 부터 직접 꺼내가는 방식
- // Pull 방식
- abstract class IObserver {
- private Subject subject;
- public Subject getSubject() {
- return subject;
- }
- public abstract void update(Object arg);
- public void setSubject(Subject ib) {
- subject = ib;
- }
- }
- abstract class Subject {
- List<IObserver> observers = new ArrayList<>();
- public Subject() {
- }
- public void addObserver(IObserver ib) {
- observers.add(ib);
- ib.setSubject(this);
- }
- public void removeObjserver(IObserver ib) {
- observers.remove(ib);
- }
- public void notifyDataSetChanged(Object data) {
- for (IObserver e : observers) {
- e.update(data);
- }
- }
- public abstract boolean edit();
- }
- class BarGraph extends IObserver {
- @Override
- public void update(Object arg) {
- int[] data = (int[]) arg;
- System.out.println("########### Bar Graph ############");
- for (int i = 0; i < data.length; i++) {
- System.out.println(i + " : " + data[i]);
- }
- }
- }
- class CircleGraph extends IObserver {
- @Override
- public void update(Object arg) {
- int[] data = (int[]) arg;
- System.out.println("########### Circle Graph ############");
- for (int i = 0; i < data.length; i++) {
- System.out.println(i + " : " + data[i]);
- }
- }
- }
- class PieGraph extends IObserver {
- @Override
- public void update(Object arg) {
- int[] data = (int[]) arg;
- // Pull 방식
- // Subject가 변겨오디었을 경우 표에서 data를 끌어와야한다.
- // Subject의 참조를 얻어낸다.
- Table table = (Table) getSubject(); // 강하게 결합된다.
- // 단점 : 캐스팅이 필요하다.
- // 장점 : Table의 모든 메소드를 호출 가능하므로
- // data를 인자로 전달 받을 때 마다 훨씬ㄷ ㅓ많은 정보를 얻어낼 수 있다.
- // 강하게 결합된다.
- // 디자인 측면에서 좋지 않다.
- // Push 방식이 더 선호된다.
- System.out.println("########### Pie Graph ############");
- for (int i = 0; i < data.length; i++) {
- System.out.println(i + " : " + table.getCellValue(i));
- }
- }
- }
- class Table extends Subject {
- private Scanner scan;
- int[] data = { 0, 0, 0, 0, 0 };
- public int getCellValue(int index) {
- return data[index];
- }
- public boolean edit() {
- scan = new Scanner(System.in);
- System.out.println("Index >>");
- int idx = scan.nextInt();
- if (idx == 99) {
- return false;
- }
- System.out.println("Data >>");
- data[idx] = scan.nextInt();
- notifyDataSetChanged(data);
- return true;
- }
- }
- public class Ex2 {
- public static void main(String[] args) {
- Table table = new Table();
- table.addObserver(new PieGraph());
- table.addObserver(new BarGraph());
- while (table.edit()) {
- }
- }
- }
'java > design_pattern' 카테고리의 다른 글
Chain of Responsibility Pattern - 책임의 전가 (0) | 2014.07.01 |
---|---|
MediatorPattern - 중재자 패턴 (0) | 2014.07.01 |
Factory method pattern (0) | 2014.06.27 |
Flyweight Pattern (0) | 2014.06.27 |
Prototype Pattern (0) | 2014.06.27 |