관찰자 모드(이거 너무 많이 썼어)

7708 단어 java 디자인 모드

하나.관찰자 모드의 정의


대상 간의 일대다 의존 관계를 정의합니다. 대상이 상태를 바꾸지 않으면 모든 의존 대상이 알림을 받고 자동으로 업데이트됩니다.

둘.관찰자 모드의 사용 장면


(1).연관 동작 장면에서 주의해야 할 것은 연관 동작은'조합'관계가 아니라 분리할 수 있다는 것이다.
(2).이벤트 다중 트리거 장면
(3).크로스 시스템의 메시지 교환 장면, 예를 들어 메시지 대기열, 이벤트 버스의 처리 메커니즘.

셋.관찰자 모드의 UML 클래스


역할 소개:
ject: 추상적인 주제(Observer), 즉 관찰된observable의 역할이다. 추상적인 주제 역할은 모든 관찰자 대상의 인용을 하나의 집합에 저장하고 모든 주제는 임의의 관찰자가 있을 수 있다. 추상적인 주제는 하나의 인터페이스를 제공하여 관찰자 대상을 증가하거나 삭제할 수 있다.
concreteSubject: 구체적인 주제(ConcreteObservable). 이 역할은 관련 상태를 구체적인 관찰 대상에 저장하고 구체적인 주제의 내부 상태가 바뀔 때 등록된 모든 관찰자에게 알림을 보낸다. 구체적인 주제 역할은 구체적인 관찰 대상(ConcreteObservable) 역할이라고도 부른다.
observale: 추상적인 관찰자, 이 역할은 관찰자의 추상적인 클래스로 업데이트 인터페이스를 정의하여 주제의 변경 알림을 받을 때 자신을 업데이트합니다.
ConcreteObserver: 구체적인 관찰자, 이 역할은 추상적인 관찰자 역할이 정의한 업데이트 인터페이스를 실현하여 주제의 상태가 변할 때 자신의 상태를 업데이트합니다.

넷.관찰자 모델의 간단한 실현

/**
 * Created by Administrator on 2016/4/4 0004.
 * // 
 */
public interface Observer {
    void update(String str);
}
/**
 * Created by Administrator on 2016/4/4 0004.
 * // 
 */
public interface Observable {
    void addObserver(Observer obs);
    void notifyAllChanges(String str);
    void removeObserver(Observer obs);
}
/**
 * Created by Administrator on 2016/4/4 0004.
 */
public class ConcreteObserver implements  Observer {
    private String name ;

    public ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(String str) {
        System.out.println(str+name);
    }
}
/**
 * Created by Administrator on 2016/4/4 0004.
 * // 
 */
public class ConcreteObservable implements Observable {
    //  
    private List list = new ArrayList();

    @Override
    public void addObserver(Observer obs) {
        list.add(obs);
    }

    @Override
    public void notifyAllChanges(String str) {
        //  
        for (Observer watcher : list) {
            watcher.update(str);
        }
    }

    @Override
    public void removeObserver(Observer obs) {
        list.remove(obs);
    }
}
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Observable girl = new ConcreteObservable(); // 

        Observer watcher1 = new ConcreteObserver(" "); // 
        Observer watcher2 = new ConcreteObserver(" "); // 
        Observer watcher3 = new ConcreteObserver(" "); // 

        girl.addObserver(watcher1);
        girl.addObserver(watcher2);
        girl.addObserver(watcher3);

        girl.notifyAllChanges(" "); // // 
    }
}

결과:
오늘 날씨 맑음 크레인 1호 오늘 날씨 맑음 크레인 2호 오늘 날씨 맑음 크레인 3호
5. 고급 실천은 다음 블로그 안드로이드 이벤트버스 원본 분석을 참고할 수 있다.
http://blog.csdn.net/u011889786/article/details/51056215

좋은 웹페이지 즐겨찾기