观察者模式
2015-07-15 17:54
267 查看
Observer pattern is used when there is one-to-many relationship between objects such as if one object is modified, its depenedent objects are to be notified automatically. Observer pattern falls under behavioral pattern category.
Implementation
Observer pattern uses three actor classes. Subject, Observer and Client. Subject is an object having methods to attach and detach observers to a client object. We have created an abstract class Observer and a concrete class Subject thatis extending class Observer.
ObserverPatternDemo, our demo class, will use Subject and concrete class object to show observer pattern in action.
Step 1
Create Subject class.Subject.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(); } } }
Step 2
Create Observer class.Observer.java
public abstract class Observer { protected Subject subject; public abstract void update(); }
Step 3
Create concrete observer classesBinaryObserver.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() ) ); } }
OctalObserver.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() ) ); } }
HexaObserver.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() ); } }
Step 4
Use Subject and concrete observer objects.ObserverPatternDemo.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); } }
Step 5
Verify the output.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
相关文章推荐
- 享元模式 - 结构型模式
- spring中同一个定时任务执行两遍
- CF 558A(Lala Land and Apple Trees-暴力)
- git删除tag和branch
- java ImageIO处理图像的封装
- 据说这是设计大牛整理的一份设计人员必看文章,不晓得对你是否有用
- map的一个注意点
- SpringMVC案例1——对User表进行CRUD操作
- 据说这是设计大牛整理的一份设计人员必看文章,不晓得对你是否有用
- SpringMVC案例1——对User表进行CRUD操作
- 黑象
- 将大数据利用 BCP 导出SqlServer数据到CSV
- javaFQA
- Lua查找表元素过程(元表、__index方法是如何工作的)
- nodejs express3.x 与 express4.x 的router区别 与修改方法
- 小米手机连不上android studio
- 在scala中调用java代码
- 【java】多线程小例子(卖票示例)
- windowns server 2012 搭建完成ping 不通
- C#非递归先序遍历二叉树实例