RxJava入门实践〇
WalLaura
8年前
<p>最近大家都在学习RXJAVA,作为有理想(mei shi gan)的程序员,RxJava还是沈有必要学习下的。</p> <p>RXJAVA地址: <a href="/misc/goto?guid=4958865750209621132" rel="nofollow,noindex">https://github.com/ReactiveX/RxJava</a></p> <h2><strong>什么是观察者模式</strong></h2> <p>由于Rxjava是基于观察者模式的,所以大家很有必要了解下什么是观察者模式。</p> <p>观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。</p> <p>观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。</p> <p><strong>意图:</strong> 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。</p> <p><strong>主要解决:</strong> 一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。</p> <p><strong>何时使用:</strong> 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。</p> <p><strong>如何解决:</strong> 使用面向对象技术,可以将这种依赖关系弱化。</p> <p><strong>关键代码:</strong> 在抽象类里有一个 ArrayList 存放观察者们。</p> <p><strong>应用实例:</strong> 1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。</p> <p><strong>优点:</strong> 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。</p> <p><strong>缺点:</strong> 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。</p> <p><strong>使用场景:</strong> 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。</p> <p><strong>注意事项:</strong> 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。</p> <h2>实现</h2> <p>观察者模式使用三个类 Subject、Observer 和 Client。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。我们创建 <em>Subject</em> 类、 <em>Observer</em> 抽象类和扩展了抽象类 <em>Observer</em> 的实体类。</p> <p><em>ObserverPatternDemo</em> ,我们的演示类使用 <em>Subject</em> 和实体类对象来演示观察者模式。</p> <p><img src="https://simg.open-open.com/show/d522a5a3e5bdc6f2befa416d890821f7.jpg" alt="观察者模式的 UML 图" /></p> <h3>步骤 1</h3> <p>创建 Subject 类。</p> <p>Subject.java</p> <pre> <code class="language-java">import java.util.ArrayList; import java.util.List; public class Subject { private List<Observer> observers = new ArrayList<Observer>(); private int state; public int getState() { return state; } public void setState(int state) { this.state = state; notifyAllObservers(); } public void attach(Observer observer){ observers.add(observer); } public void notifyAllObservers(){ for (Observer observer : observers) { observer.update(); } } }</code></pre> <h3>步骤 2</h3> <p>创建 Observer 类。</p> <p>Observer.java</p> <pre> <code class="language-java">public abstract class Observer { protected Subject subject; public abstract void update(); }</code></pre> <h3>步骤 3</h3> <p>创建实体观察者类。</p> <p>BinaryObserver.java</p> <pre> <code class="language-java">public class BinaryObserver extends Observer{ public BinaryObserver(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "Binary String: " + Integer.toBinaryString( subject.getState() ) ); } }</code></pre> <p>OctalObserver.java</p> <pre> <code class="language-java">public class OctalObserver extends Observer{ public OctalObserver(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "Octal String: " + Integer.toOctalString( subject.getState() ) ); } }</code></pre> <p>HexaObserver.java</p> <pre> <code class="language-java">public class HexaObserver extends Observer{ public HexaObserver(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "Hex String: " + Integer.toHexString( subject.getState() ).toUpperCase() ); } }</code></pre> <h3>步骤 4</h3> <p>使用 <em>Subject</em> 和实体观察者对象。</p> <p>ObserverPatternDemo.java</p> <pre> <code class="language-java">public class ObserverPatternDemo { public static void main(String[] args) { Subject subject = new Subject(); new HexaObserver(subject); new OctalObserver(subject); new BinaryObserver(subject); System.out.println("First state change: 15"); subject.setState(15); System.out.println("Second state change: 10"); subject.setState(10); } }</code></pre> <h3>步骤 5</h3> <p>验证输出。</p> <pre> <code>First state change: 15 Hex String: F Octal String: 17 Binary String: 1111 Second state change: 10 Hex String: A Octal String: 12 Binary String: 1010</code></pre> <p> 来自: <a href="/misc/goto?guid=4959670544945460454" rel="nofollow">http://blog.flyou.ren/?p=227</a></p>