Java 디자인 모드【1】--관찰자

4375 단어

1. 개념


객체 간에 일대다 관계가 있는 경우 관찰자 모드(Observer Pattern)를 사용합니다.예를 들어, 대상이 수정되면 의존 대상을 자동으로 알린다.관찰자 모델은 행위형 모델에 속한다.

2. 소개

  • 의도: 대상 간의 일대다 의존 관계를 정의하고 한 대상의 상태가 바뀌면 그에 의존하는 모든 대상이 알림을 받고 자동으로 업데이트된다.
  • 주요 해결 문제: 한 대상의 상태가 다른 대상에게 통지되는 문제를 해결하고 사용하기 쉽고 낮은 결합을 고려하여 높은 협력을 확보해야 한다.
  • 사용 장면: 한 대상(목표 대상)의 상태가 바뀌면 모든 의존 대상(관찰자 대상)이 알림을 받고 알림을 방송한다.
  • 해결 방식: 대상을 대상으로 하는 기술을 사용하면 이런 의존 관계를 약화시킬 수 있다.
  • 코드점: 추상 클래스에 Array List 저장 관찰자들이 있습니다.
  • 응용 실례:
  • 경매를 할 때 경매사는 최고 가격을 관찰한 후에 다른 경매자에게 경매를 통지한다.
    서유기에서 오공은 보살에게 붉은 아이를 굴복시켜 달라고 부탁했다. 보살은 바닥에 물을 뿌려 한 늙은 거북이를 불러왔다. 이 거북이가 바로 관찰자이다. 그는 보살이 물을 뿌리는 동작을 관찰했다.

    2.1. 장단점


    2.1.1. 장점

  • 관찰자와 피관찰자는 추상적으로 결합된다.
  • 촉발 메커니즘을 구축한다.

  • 2.1.2. 결점

  • 피관찰자 대상에 직간접적인 관찰자가 많으면 모든 관찰자를 통지하는 데 시간이 많이 걸린다
  • 관찰자와 관찰목표 사이에 순환 의존이 있으면 관찰목표는 그들 사이를 순환 호출하여 시스템 붕괴를 초래할 수 있다
  • 관찰자 모델은 상응하는 메커니즘이 없어서 관찰자가 관찰한 목표 대상이 어떻게 변화했는지 알 수 없고 관찰 목표가 변화했는지 알 뿐이다.

  • 3. 장면 사용:


    하나의 추상 모델은 두 가지 측면이 있는데, 그 중 하나는 다른 측면에 의존한다.이러한 부분을 독립된 대상에 봉하여 각각 독립적으로 바꾸고 복용할 수 있도록 하다.한 대상의 변화는 다른 한 개 이상의 대상도 바뀌게 할 것이다. 구체적으로 얼마나 많은 대상이 바뀔지 모르면 대상 간의 결합도를 낮출 수 있다.한 대상은 다른 대상에게 통지해야 하며, 이 대상들이 누구인지 모른다.시스템에서 트리거 체인을 만들어야 합니다. A 대상의 행위는 B 대상에게 영향을 주고 B 대상의 행위는 C 대상에게 영향을 줍니다. 관찰자 모드를 사용하여 체인식 트리거 메커니즘을 만들 수 있습니다.
    주의 사항
  • JAVA에 관찰자 모델에 대한 지원 클래스가 있음
  • 순환 인용을 피한다.3. 순서대로 실행하면 어떤 관찰자의 오류가 시스템 케이스를 초래할 수 있으며 보통 비동기적인 방식을 사용한다.

  • 4. 실현


    관찰자 모드에는 세 가지 유형의 Subject, Observer 및 Client가 사용됩니다.Subject 객체에는 관찰자를 클라이언트 객체로 결합하고 클라이언트 객체에서 관찰자를 결합해제하는 방법이 있습니다.Subject 클래스, Observer 추상 클래스를 만들고 추상 클래스 Observer의 실체 클래스를 확장했습니다.

    4.1. 관찰자


    4.1.1. 이음매

    
    package xyz.wongs.shumer.design.observer;
    
    public interface Observer {
    
        void see(BaseSubject abstractSubject);
    }
    

    4.1.2. 관찰자 동작

    
    package xyz.wongs.shumer.design.observer;
    
    public class ObserverImpl implements Observer {
    
        private String msg;
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        @Override
        public void see(BaseSubject baseSubject) {
            msg = ((Subject)baseSubject).getMsg();
    
        }
    }
    
    

    4.2. 메시지


    4.2.1. 추상류

    
    package xyz.wongs.shumer.design.observer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public abstract class BaseSubject {
    
        private List list = new ArrayList();
    
        public void addObserver(Observer observer){
            list.add(observer);
        }
    
        public void removeObserver(Observer observer){
            list.remove(observer);
        }
    
        public void notifyObserver(){
            for(Observer observer:list){
                observer.see(this);
            }
        }
    }
    
    

    4.2.2. 주제 구현

    
    package xyz.wongs.shumer.design.observer;
    
    public class Subject extends BaseSubject {
    
        private String msg;
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg){
            this.msg=msg;
            this.notifyObserver();
        }
    }
    
    

    4.3. 테스트 클래스

    
    package xyz.wongs.shumer;
    
    import static org.junit.Assert.assertTrue;
    
    import org.junit.Test;
    import xyz.wongs.shumer.design.observer.ObserverImpl;
    import xyz.wongs.shumer.design.observer.Subject;
    
    
    public class AppTest {
    
        @Test
        public void testObserver() {
    
            Subject targetSubject = new Subject();
    
            ObserverImpl observerDesign1 = new ObserverImpl();
    
            ObserverImpl observerDesign2 = new ObserverImpl();
    
            ObserverImpl observerDesign3 = new ObserverImpl();
            ObserverImpl observerDesign4 = new ObserverImpl();
    
            targetSubject.addObserver(observerDesign1);
            targetSubject.addObserver(observerDesign2);
            targetSubject.addObserver(observerDesign3);
            targetSubject.addObserver(observerDesign4);
    
            targetSubject.setMsg(Thread.currentThread().getName());
    
            System.out.println(observerDesign1.getMsg());
            System.out.println(observerDesign2.getMsg());
            System.out.println(observerDesign3.getMsg());
            System.out.println(observerDesign4.getMsg());
        }
    }
    
    
    

    2019-08-29_211956.png

    좋은 웹페이지 즐겨찾기