이 글에서는 주로 JavaDesign Pattern에서 Observer Pattern을 사용하여 WeChat 공개 계정을 개발하는 예를 소개합니다. WeChat SDK 및 Java의 다른 부분은 여기서 자세히 설명하지 않습니다. .개발 과정에서 관찰자 모드의 핵심 부분과 장점만 구현한 부분만 참고해주세요. ? 갱단이 절도를 저지를 때 문 앞에는 항상 한두 명이 경비를 서고 있으며, 문제의 조짐이 보이면 내부 공범에게 즉시 통보하여 긴급 퇴각합니다. 바람을 피우는 사람이 반드시 내부 공범을 모두 아는 것은 아닐 수도 있고, 바람을 피우는 사람을 모르는 새로운 사람이 내부에 있을 수도 있습니다. 그러나 그것은 중요하지 않습니다. 그들은 이미 비밀 코드에 동의했기 때문에 그들 사이의 통신에는 영향을 미치지 않습니다.
하하, 위에서 언급한 감시자와 도둑의 관계는 현실의 관찰자 패턴의 살아있는 예입니다.
관찰자 패턴은 게시/구독 패턴이라고도 합니다. GOF는 관찰자 패턴을 다음과 같이 정의합니다:
간의 일대다 종속 관계를 정의합니다. 객체의 상태가 변경되면 해당 객체에 의존하는 모든 객체가 알림을 받고 업데이트됩니다. 자동으로. 여기서 먼저 객체 지향
디자인의 중요한 원칙인 단일 책임 원칙에 대해 이야기하겠습니다. 따라서 시스템의 각 객체는 문제 영역 내의 개별 추상화에 초점을 맞춰야 합니다. 따라서 이상적으로 개체는 한 가지 작업만 수행합니다. 이는 개발 시 많은 이점을 제공합니다. 재사용성과 유지 관리성을 제공하고 재구성을 위한 좋은 기반이기도 합니다. 그래서 거의 모든 디자인 패턴은 이 기본 디자인 원칙
을 기반으로 합니다. 현재 옵저버 패턴을 설명하는 대부분의 예제가 이 주제에 관한 것이기 때문에 옵저버 패턴의 기원은 GUI 및 비즈니스 데이터 처리에 있어야 한다고 생각합니다. 그러나 관찰자 패턴의 적용은 결코 이 측면에만 국한되지 않습니다.
사진 보기 :
위 사진에는 각 사용자마다 3줄씩 있는데, 그림을 명확하게 하기 위해 생략했습니다.
위 그림과 같이 서비스 계정이 주체이고, 사용자가 관찰자입니다. 이제 기능을 명확히 해보겠습니다.1. 서비스 계정이 주제이고 비즈니스가 메시지를 푸시합니다
2. 관찰자는 주제를 구독하기만 하면 새 메시지가 전송됩니다
3. 언제 원하지 않으세요 주제 메시지를 받으면 구독 취소
4. 서비스 계정이 있는 한 구독하는 사람은 항상 있을 것입니다
자, 이제 옵저버의 클래스 다이어그램을 살펴보겠습니다. 패턴:
다음 단계는 WeChat 3D 복권 서비스 계정과 일부 가입자를 시뮬레이션합니다.
먼저 테마package com.zhy.pattern.observer; import java.util.ArrayList; import java.util.List; public class ObjectFor3D implements Subject { private List<observer> observers = new ArrayList<observer>(); /** * 3D彩票的号码 */ private String msg; @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { int index = observers.indexOf(observer); if (index >= 0) { observers.remove(index); } } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(msg); } } /** * 主题更新消息 * * @param msg */ public void setMsg(String msg) { this.msg = msg; notifyObservers(); } }</observer></observer>
두 명의 사용자를 시뮬레이션합니다.
package com.zhy.pattern.observer; public class Observer1 implements Observer { private Subject subject; public Observer1(Subject subject) { this.subject = subject; subject.registerObserver(this); } @Override public void update(String msg) { System.out.println("observer1 得到 3D 号码 -->" + msg + ", 我要记下来。"); } }
package com.zhy.pattern.observer; public class Observer2 implements Observer { private Subject subject ; public Observer2(Subject subject) { this.subject = subject ; subject.registerObserver(this); } @Override public void update(String msg) { System.out.println("observer2 得到 3D 号码 -->" + msg + "我要告诉舍友们。"); } }
서비스 계정은 메시지를 구독하는 모든 사용자를 유지하는 것을 볼 수 있습니다. 서비스 계정에 새 메시지가 있으면 모든 사용자에게 알림이 전송됩니다. 전체
아키텍처는 테마 구현이 사용자에 따라 달라지지 않으며, 사용자가 획득한 테마의 코드를 변경할 필요가 없습니다. 데이터는 테마와 아무런 관련이 없습니다. 마지막으로 테스트 코드를 살펴보세요.
package com.zhy.pattern.observer.test; import com.zhy.pattern.observer.ObjectFor3D; import com.zhy.pattern.observer.Observer; import com.zhy.pattern.observer.Observer1; import com.zhy.pattern.observer.Observer2; import com.zhy.pattern.observer.Subject; public class Test { public static void main(String[] args) { //模拟一个3D的服务号 ObjectFor3D subjectFor3d = new ObjectFor3D(); //客户1 Observer observer1 = new Observer1(subjectFor3d); Observer observer2 = new Observer2(subjectFor3d); subjectFor3d.setMsg("20140420的3D号码是:127" ); subjectFor3d.setMsg("20140421的3D号码是:333" ); } }
observer1 得到 3D 号码 -->20140420的3D号码是:127, 我要记下来。 observer2 得到 3D 号码 -->20140420的3D号码是:127我要告诉舍友们。 observer1 得到 3D 号码 -->20140421的3D号码是:333, 我要记下来。 observer2 得到 3D 号码 -->20140421的3D号码是:333我要告诉舍友们。
JDK나 Andorid에는 XXXView.addXXXListenter와 같은 관찰자 모드 및 물론 XXXView.setOnXXXListener 관찰자 모드는 일대다 관계이고 setXXXListener는 일대일 관계이므로 호출해야 하기 때문에 반드시 관찰자 모드일 필요는 없습니다. 콜백.
恭喜你学会了观察者模式,上面的观察者模式使我们从无到有的写出,当然了java中已经帮我们实现了观察者模式,借助于java.util.Observable和java.util.Observer。
下面我们使用Java内置的类实现观察者模式:
首先是一个3D彩票服务号主题:
package com.zhy.pattern.observer.java; import java.util.Observable; public class SubjectFor3d extends Observable { private String msg ; public String getMsg() { return msg; } /** * 主题更新消息 * * @param msg */ public void setMsg(String msg) { this.msg = msg ; setChanged(); notifyObservers(); } }
下面是一个双色球的服务号主题:
package com.zhy.pattern.observer.java; import java.util.Observable; public class SubjectForSSQ extends Observable { private String msg ; public String getMsg() { return msg; } /** * 主题更新消息 * * @param msg */ public void setMsg(String msg) { this.msg = msg ; setChanged(); notifyObservers(); } }
最后是我们的使用者:
package com.zhy.pattern.observer.java; import java.util.Observable; import java.util.Observer; public class Observer1 implements Observer { public void registerSubject(Observable observable) { observable.addObserver(this); } @Override public void update(Observable o, Object arg) { if (o instanceof SubjectFor3d) { SubjectFor3d subjectFor3d = (SubjectFor3d) o; System.out.println("subjectFor3d's msg -- >" + subjectFor3d.getMsg()); } if (o instanceof SubjectForSSQ) { SubjectForSSQ subjectForSSQ = (SubjectForSSQ) o; System.out.println("subjectForSSQ's msg -- >" + subjectForSSQ.getMsg()); } } }
看一个测试代码:
package com.zhy.pattern.observer.java; public class Test { public static void main(String[] args) { SubjectFor3d subjectFor3d = new SubjectFor3d() ; SubjectForSSQ subjectForSSQ = new SubjectForSSQ() ; Observer1 observer1 = new Observer1(); observer1.registerSubject(subjectFor3d); observer1.registerSubject(subjectForSSQ); subjectFor3d.setMsg("hello 3d'nums : 110 "); subjectForSSQ.setMsg("ssq'nums : 12,13,31,5,4,3 15"); } }
测试结果:
subjectFor3d's msg -- >hello 3d'nums : 110 subjectForSSQ's msg -- >ssq'nums : 12,13,31,5,4,3 15
可以看出,使用Java内置的类实现观察者模式,代码非常简洁,对了addObserver,removeObserver,notifyObservers都已经为我们实现了,所有可以看出Observable(主题)是一个类,而不是一个接口,基本上书上都对于Java的如此设计抱有反面的态度,觉得Java内置的观察者模式,违法了面向接口编程这个原则,但是如果转念想一想,的确你拿一个主题在这写观察者模式(我们自己的实现),接口的思想很好,但是如果现在继续添加很多个主题,每个主题的ddObserver,removeObserver,notifyObservers代码基本都是相同的吧,接口是无法实现代码复用的,而且也没有办法使用组合的模式实现这三个方法的复用,所以我觉得这里把这三个方法在类中实现是合理的。
위 내용은 Java 디자인 패턴 중 관찰자 패턴을 사용하여 WeChat 공식 계정을 개발하기 위한 예제 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!