옵저버 모드는 소프트웨어 설계 모드 중 하나이며 특히 GUI 프로그래밍에서도 일반적으로 사용됩니다. 인터넷에 작성된 디자인 패턴에 관한 많은 기사가 있으며 많은 기사가 잘 작성되었습니다. 초기 휠을 반복한다는 의심이 있지만,이 휠은 다른 바퀴가 아니며, 초점이 다른 아이디어, 아이디어 및 다른 방법으로 말하는 방법이 아닙니다.
주요 요소
주제:
주제는 관찰자가 관찰 한 객체입니다. 주제에는 다음 세 가지 특성이 있어야합니다.
관찰자:
대상이 변경되면 특정 처리에 대한 알림을받는 것이 관찰자에게 있어야하는 기능입니다.
이 모드를 사용하는 이유
우유 배달 스테이션이 주제임을 설명하는 예는 다음과 같습니다. 우유 구독 고객은 모니터입니다. 고객이 우유 배달 스테이션에서 우유를 구독 한 후에는 매일 우유를 받게됩니다. 고객이 구독하고 싶지 않으면 취소 할 수 있으며 앞으로 우유를받지 못할 것입니다.
느슨한 커플 링
관찰자는 주제를 수정하지 않고 코드를 추가하거나 삭제합니다. 주제를 추가하거나 삭제하는 해당 메소드를 호출하십시오.
이 주제는 관찰자에게 알리는 책임이 있지만 관찰자가 알림을 어떻게 다루는 지 알 필요는 없습니다. 예를 들어, 우유 배달 스테이션은 우유를 배달 할 책임이 있으며 고객이 마시거나 얼굴을 씻는지 여부는 신경 쓰지 않습니다.
관찰자는 주제와 관련된 세부 사항을 관찰하지 않고 주제 알림을 기다려야합니다. 같은 예에 관해서는, 고객은 우유 배달 스테이션에 대해서만 우유를 배달하기 위해 우유 배달 스테이션에 대해서만 신경을 써야합니다.
Java는 관찰 모드를 구현합니다
1. Java 자신의 구현
클래스 다이어그램
/ ** * 관찰 대상은 java.util.observable에서 상속됩니다 * @author stone * */ public class updateobservsable은 관찰 가능 {private int data; public updateobservable (Observer Observer) {addobserver (옵저버); / * * 다른 관찰자 추가 */} public int getData () {return data; } public void setData (int data) {if (data! = this.data) {this.data = data; setChanged (); // 태그 변경, notifyObservers (); // notification}} @override public synchronized void addobserver (Observer o) {super.addobserver (o); } @override public synchronized void deleteobserver (Observer o) {super.deleteobserver (o); } @override public void notifyobservers () {super.NotifyObservers (); } @override public void notifyobservers (Object Arg) {super.NotifyObservers (arg); } @override public synchronized void deleteobservers () {super.deleteobservers (); } @override protected synchronized void setchanged () {super.setchanged (); } @override Protected Synchronized void clearchanged () {super.clearchanged (); } @override public synchronized boolean haschanged () {return super.haschanged (); } @override public synchronized int countobservers () {return super.countobservers (); }} / ** * 관찰자는 java.util.observer 인터페이스 * @author stone */ public class updateobserver inserver {@override public void update (Observable O, Object Arg) {System.out.println ( "데이터 변경에 대한 알림 :"); if (o instanceof updateObservable) {updateObservable uo = (updateObservable) o; System.out.print ( "데이터 변경 :" + uo.getData ()); }}} 2. 맞춤형 관찰 모델
클래스 다이어그램
/ ** * Abstract Observer * 관찰 업데이트 * @author stone */ public interface iwatcher {/ * * 알림 인터페이스 : * 1. 간단한 알림 * 2. 관찰자는 대상 변경에 대한 데이터가 필요하므로 대상이 매개 변수로 사용될 수 있습니다. 무효 업데이트 (); } / ** * Abstract Target Subject *는 관찰자 객체를 등록하고 삭제하는 인터페이스를 제공하며 관찰자에게 관찰 할 수있는 통지 * 및 대상이 관찰되는 인터페이스 */ public interface iWatchedSubject {public void add (iwatcher watch); 공개 무효 제거 (iwatcher watch); 공개 void notifywhatchers (); 공개 void update (); // 관찰 된 비즈니스 변경에 대한 인터페이스} / ** * 특정 관찰자 콘크리트 관찰자 * * @Author Stone */ public class updatewatcher는 iWatcher {@override public void update () {system.out.println (이 + "관찰 : 대상이 업데이트되었습니다"); }} / ** * 특정 대상 역할 콘크리트 대상 * @Author Stone */ public class updateWatchedSubject 구현 iWatchedSubject {private list <iwatcher> 목록; public updateWatchedSubject () {this.list = new ArrayList <iwatcher> (); } @override public void add (iwatcher watch) {this.list.add (Watch); } @override public void remove (iwatcher watch) {this.list.remove (Watch); } @override public void notifywhatchers () {for (iwatcher watcher : list) {watcher.update (); }} @override public void update () {system.out.println ( "대상 업데이트 ......"); NotifyWhatchers (); }} 청취자는 관찰자의 구현입니다.
클래스 다이어그램
/ ** * 등록 후 청취자 * @Author Stone */ public interface iRegisterListener {void onregistered (); } / ** * 사용자가 로그인 할 때 청취자 * @author stone * */ public interface iloginListener {void onlogined (); } /** 청취자는 관찰자 모드의 구현입니다* 청취가 필요한 일부 비즈니스 인터페이스에 리스너를 추가하고 청취자의 해당 메소드를 호출하여 청취*/ public class user {public void register (iriregisterListener Register) {/** do ... register*/ system.out.println ( "Registering ..."); // 등록 register.onregistered () 후; } public void login (iloginListener login) { / * * do ... login * / system.out.println ( "등록 ..."); // 로그인 한 후 .OnLogined (); }} /*** 관찰자 모드 동작 패턴* 관찰자 모드는 일대일 의존성을 정의하여 여러 관찰자 객체가 동시에 대상 객체를 관찰 할 수 있습니다. *이 대상 객체가 상태에서 변경되면 모든 관찰자 객체에 알리므로 자동으로 스스로 업데이트 할 수 있습니다. 대상 객체는 관찰자를 추가, 제거 및 알리기 위해 인터페이스가 필요합니다 * * @Author Stone */ public class test {public static void main (String [] args) {/ * * Java의 자체 관찰자 인터페이스 및 관찰 가능한 클래스 */ updateObservable = new updateObservable (new updateObserver ()); Observable.SetData (99); System.out.println ( ""); System.out.println ( ""); /** Custom Observer Model*/ iWatchedSubject New = New UpdateWatchedSubject (); watched.add (new updateWatcher ()); watched.add (new updateWatcher ()); watched.update (); System.out.println ( ""); /** 하위 모드-리스너*/ 사용자 user = new user (); user.register (new iriregisterListener () {@override public void onregistered () {system.out.println ( "등록을 듣고 ...");}}); user.login (new iloginListener () {@override public void onlogined () {system.out.println ( "로그인을 들으면 ...");}}); }}인쇄
데이터 변경에 대한 알림 : 데이터 변경 : 99 대상이 업데이트되고 있습니다 ... Observer.updateWatcher@457471E0 관찰 : 대상이 Observer.updateWatcher@5Fe04CBF가 업데이트되었습니다. . . 로그인 ... 로그인을 듣고 나서. . .