관찰자 패턴

개체 간의 일대다 종속성을 정의하여 한 개체의 상태가 변경되면 모든 종속 항목에 알림이 자동으로 전송되고 업데이트됩니다.

참가자들


  • 대상: 관찰자를 알고 있습니다. 다수의 Observer 객체는 주제를 관찰할 수 있습니다. Observer 객체를 연결하고 분리하기 위한 인터페이스를 제공합니다.
  • ConcreteSubject: ConcreteObserver에 관심 있는 상태를 저장합니다. 상태가 변경되면 관찰자에게 알림을 보냅니다
  • .
  • 관찰자: 주제의 변경 사항을 알려야 하는 객체에 대한 업데이트 인터페이스를 정의합니다.
  • ConcreteObserver: ConcreteSubject 객체에 대한 참조를 유지합니다. 주제와 일관성을 유지해야 하는 상태를 저장합니다. Observer 업데이트 인터페이스를 구현하여 주체의 상태와 일관성을 유지합니다.

  • 암호



    public class Main {
    
        public static void main(String[] args) {
            ConcreteSubject s = new ConcreteSubject();
            s.attach(new ConcreteObserver(s, "X"));
            s.attach(new ConcreteObserver(s, "Y"));
            s.attach(new ConcreteObserver(s, "Z"));
            s.setSubjectState("ABC");
            s.notifyObservers();
        }
    }
    
    public class Subject {
    
        private List<Observer> observers = new ArrayList<>();
    
        public void attach(Observer observer) {
            observers.add(observer);
        }
    
        public void detach(Observer observer) {
            observers.remove(observer);
        }
    
        public void notifyObservers() {
            for (Observer o : observers) {
                o.update();
            }
        }
    }
    
    public class ConcreteSubject extends Subject {
    
        private String subjectState;
    
        public String getSubjectState() {
            return subjectState;
        }
    
        public void setSubjectState(String subjectState) {
            this.subjectState = subjectState;
        }    
    }
    
    public interface Observer {
    
        void update();
    }
    
    public class ConcreteObserver implements Observer {
    
        private String name;
        private ConcreteSubject subject;
    
        public ConcreteObserver(ConcreteSubject subject, String name) {
            this.subject = subject;
            this.name = name;
        }
    
        @Override
        public void update() {
            String observerState = subject.getSubjectState();
            System.out.println("Observer " + name + " state is " + observerState);
        }
    }
    

    산출



    Observer X state is ABC
    Observer Y state is ABC
    Observer Z state is ABC
    

    자바 빌트인 옵저버



    public class Main {
    
        public static void main(String[] args) {
            ConcreteSubject s = new ConcreteSubject();
            s.addObserver(new ConcreteObserver(s, "X"));
            s.addObserver(new ConcreteObserver(s, "Y"));
            s.addObserver(new ConcreteObserver(s, "Z"));
            s.setSubjectState("ABC");
            s.notifyObservers();
        }
    }
    
    import java.util.Observable;
    
    public class ConcreteSubject extends Observable {
    
        private String subjectState;
    
        public String getSubjectState() {
            return subjectState;
        }
    
        public void setSubjectState(String subjectState) {
            this.subjectState = subjectState;
            setChanged();
        }
    
    }
    
    import java.util.Observable;
    import java.util.Observer;
    
    public class ConcreteObserver implements Observer {
    
        Observable subject;
        private String name;
    
        public ConcreteObserver(Observable subject, String name) {
            this.subject = subject;
            this.name = name;
        }
    
        @Override
        public void update(Observable obs, Object arg) {
            if(obs instanceof ConcreteSubject) {
                ConcreteSubject observable = (ConcreteSubject)obs;
                System.out.println("Observer " + name + " state is " + observable.getSubjectState());
            }       
        }
    }
    




    eidherjulian61 / 디자인 패턴






    좋은 웹페이지 즐겨찾기