この記事では主に、JavaデザインパターンのObserverパターンを使用したWeChatパブリックアカウントの開発例を紹介します。ここでは、WeChat SDKとJavaのその他の部分については詳しく説明しません。開発プロセス中の観察者は、モデルの利点を反映しています。困っている友人はそれを参照できます
警察映画でギャングがどのように犯罪に協力したかをまだ覚えていますか?ギャングが窃盗を行っているときは、常に 1 人か 2 人がドアのところで警備をしており、トラブルの兆候があれば、内部にいる共犯者に直ちに通報され、緊急避難します。もしかしたら、浮気をしている人は必ずしも内部の共犯者全員を知っているわけではありませんし、浮気をしている人を知らない新しい男も中にいるかもしれません。しかし、それは問題ではありません、彼らの間の通信には影響しません、なぜなら彼らはすでに秘密のコードに同意しているからです。
はは、上で述べた監視者と泥棒の関係は、現実の観察者パターンの生きた例です。
Observer パターンは、Publish/Subscribe パターンとも呼ばれます。 GOF はオブザーバー パターンを次のように定義します。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます。ここではオブジェクト指向の設計の重要な原則、つまり単一責任の原則について話しましょう。したがって、システムの各オブジェクトは、問題領域内の個別の抽象化に焦点を当てる必要があります。したがって、理想的には、オブジェクトは 1 つのことだけを行います。これは開発に多くの利点をもたらします。再利用性と保守性が提供され、再構築の優れた基礎にもなります。
つまり、ほぼすべてのデザインパターンは、この基本的なデザイン原則に基づいています。オブザーバー パターンの起源は GUI とビジネス データの処理にあると思います。なぜなら、現在オブザーバー パターンを説明している例のほとんどがこの主題に関するものであるからです。しかし、オブザーバー パターンの適用は決してこの側面に限定されるものではありません。
さて、定義を理解するには、常に分析するための例が必要です。今日の WeChat サービス アカウントを背景として使用して、オブザーバー パターンを紹介しましょう。
上の画像には各ユーザーに 3 本の線がありますが、画像をわかりやすくするために省略されています。上の図に示すように、サービス アカウントがテーマであり、ユーザーはオブザーバーです。ここで機能を明確にします:
1. サービス アカウントはトピックであり、ビジネスはメッセージをプッシュすることです2. オブザーバーはトピックを購読するだけで済み、新しいメッセージがある限り新しいメッセージが送信されます
3このトピック メッセージが不要な場合は、購読を解除してください
4. サービス アカウントが存在する限り、常に購読者が存在します
それでは、オブザーバー モードのクラス図を見てみましょう:
それではコードタイムです。WeChat 3D 宝くじサービス アカウントと一部の加入者をシミュレートします。まず、テーマ
インターフェースとオブザーバー インターフェースを書き始めます:
package com.zhy.pattern.observer; /** * 主题接口,所有的主题必须实现此接口 * * @author zhy * */ public interface Subject { /** * 注册一个观察着 * * @param observer */ public void registerObserver(Observer observer); /** * 移除一个观察者 * * @param observer */ public void removeObserver(Observer observer); /** * 通知所有的观察着 */ public void notifyObservers(); } package com.zhy.pattern.observer; /** * @author zhy 所有的观察者需要实现此接口 */ public interface Observer { public void update(String msg); }
package com.zhy.pattern.observer; import java.util.ArrayList; import java.util.List; public class ObjectFor3D implements Subject { private Listobservers = new ArrayList (); /** * 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(); } }
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 + "我要告诉舍友们。"); } }
アーキテクチャ
全体は一種の疎結合であり、新しいユーザーを追加するときに、テーマのコードを変更する必要はありません。テーマとは関係ありません。 出力結果:observer1 得到 3D 号码 -->20140420的3D号码是:127, 我要记下来。 observer2 得到 3D 号码 -->20140420的3D号码是:127我要告诉舍友们。 observer1 得到 3D 号码 -->20140421的3D号码是:333, 我要记下来。 observer2 得到 3D 号码 -->20140421的3D号码是:333我要告诉舍友们。
恭喜你学会了观察者模式,上面的观察者模式使我们从无到有的写出,当然了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 中国語 Web サイトの他の関連記事を参照してください。