Observer Pattern
版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。 |
1、观察者模式:定义了对象间的一对多依赖,当一个对象改变状态时,它的所有依赖者能自动得到通知并更新。(出版
者+订阅者=观察者模式)
2、java.util.Observer和java.util.Observable提供内置的观察者模式支持,可以使用推和拉的方 式传送数据,注
意:不要依赖它的通知次序。其实现步骤如下:
1>.将对象变为观察者:
<1>.实现观察者接口(java.util.Observer)
<2>.调用addObserver()方法即将对象变为观察者
<3>.如想退出观察者,调用deleteObserver()即可
2>.主题发送通知:
<1>.调用setChanged()方法,标记状态已改变
<2>.调用notifyObservers():
notifyObservers()或notifyObservers(Object o)(其中o表示要传送的数据对象)
3>.观察者接受通知:
update(Observable o,Object o)
3、实现一个完整的观察者模式示例(推模式):不使用java的内置API
1>.设计UML图:
![]() 2>.Coding
<1>.主题部分
//Subject interface public interface Subject{ public void registerObserver(Observer observer); public void removeObserver(Observer observer); public void notifyObservers(); } //MapSeries:implements Subject interface import java.util.ArrayList; public class MapSeries implements Subject{ private ArrayList<Observer> observers; private String name; private String author; private double price; public MapSeries(){ observers = new ArrayList<Observer>(); } public void registerObserver(Observer observer){ observers.add(observer); } public void removeObserver(Observer observer){ int i = observers.indexOf(observer); if(i > -1){ observers.remove(i); } } public void notifyObservers(){ for(int i = 0; i < observers.size(); i++){ Observer observer = observers.get(i); observer.update(name,author,price); } } public void autoNotify(){ notifyObservers(); } public void addBook(String name, String author, double price){ this.name = name; this.author = author; this.price = price; autoNotify(); } } <2>.观察者部分
//Observer interface public interface Observer{ public void update(String name,String author,double price); } //Display interface public interface Display{ public void display(); } //display name and author public class NameAndAuthor implements Observer,Display{ private String name; private String author; private Subject subject; public NameAndAuthor(Subject subject){ this.subject = subject; subject.registerObserver(this); } public void update(String name,String author,double price){ this.name = name; this.author = author; display(); } public void display(){ System.out.println("Name: " + name + "\n" + "Author: " + author); } } //display name and price public class NameAndPrice implements Observer,Display{ private String name; private double price; private Subject subject; public NameAndPrice(Subject subject){ this.subject = subject; subject.registerObserver(this); } public void update(String name,String author,double price){ this.name = name; this.price = price; display(); } public void display(){ System.out.println("Name: " + name + "\n" + "Price: " + String.valueOf(price)); } } //display name author price public class NameAuthorPrice implements Observer,Display{ private String name; private String author; private double price; private Subject subject; public NameAuthorPrice(Subject subject){ this.subject = subject; subject.registerObserver(this); } public void update(String name,String author,double price){ this.name = name; this.author =author; this.price = price; display(); } public void display(){ System.out.println("Name: " + name + "\n" + "Author: " + author + "\n" + "Price: " + String.valueOf(price) + "\n"); } } <3>.测试部分
//test this application program public class TestObserver{ public static void main(String[] args){ MapSeries map = new MapSeries(); NameAndAuthor na = new NameAndAuthor(map); NameAndPrice np = new NameAndPrice(map); NameAuthorPrice nap = new NameAuthorPrice(map); map.addBook("Head First Design Pattern","BuFuBuXing",98.00); map.addBook("Head First Servlet&Jsp","Wenlong.Meng",99.99); map.addBook("Head First EJB","Dragon",87.00); } } <4>.测试结果部分
![]() 4、运用java内置观察者模式支持示例:拉模式
1、可观察者部分
//MapSeries:extend Observable class import java.util.Observable; public class MapSeries extends Observable{ private String name; private String author; private double price; public MapSeries(){} public void autoNotify(){ setChanged(); notifyObservers();//"拉"模式:后台调用notifyObservers(null) } public void addBook(String name, String author, double price){ this.name = name; this.author = author; this.price = price; autoNotify(); } public String getName(){ return name; } public String getAuthor(){ return author; } public double getPrice(){ return price; } } 2>.观察者部分
//display name and author import java.util.Observable; import java.util.Observer; public class NameAndAuthor implements Observer,Display{ Observable observable; private String name; private String author; public NameAndAuthor(Observable observable){ this.observable = observable; observable.addObservser(this); } public void update(Observable obs,Object org){ if(obs instanceof MapSeries){ MapSeries map = (MapSeries)obs; this.name = map.getName(); this.author = map.getAuthor(); display(); } } public void display(){ System.out.println("Name: " + name + "\n" + "Author: " + author); } } //display name author price import java.util.Observable; import java.util.Observer; public class NameAuthorPrice implements Observer,Display{ private String name; private String author; private double price; private Observable observable; public NameAuthorPrice(Observable observable){ this.observable = observable; observable.addObservser(this); } public void update(Observable observable, Object arg){ if(obs instanceof MapSeries){ MapSeries map = (MapSeries)obs; this.name = map.getName(); this.author = map.getAuthor(); this.price = map.getPrice(); display(); } } public void display(){ System.out.println("Name: " + name + "\n" + "Author: " + author + "\n" + "Price: " + String.valueOf(price) + "\n"); } } //display name and price import java.util.Observable; import java.util.Observer; public class NameAndPrice implements Observer,Display{ private String name; private double price; private Observable observable; public NameAndPrice(Observable observable){ this.observable = observable; observable.addObservser(this); } public void update(String name,String author,double price){ if(obs instanceof MapSeries){ MapSeries map = (MapSeries)obs; this.name = map.getName(); this.price = map.getPrice(); display(); } } public void display(){ System.out.println("Name: " + name + "\n" + "Price: " + String.valueOf(price)); } } 3>.测试部分
//test this application program public class TestObserver{ public static void main(String[] args){ MapSeries map = new MapSeries(); NameAndAuthor na = new NameAndAuthor(map); NameAndPrice np = new NameAndPrice(map); NameAuthorPrice nap = new NameAuthorPrice(map); map.addBook("Head First Design Pattern","BuFuBuXing",98.00); map.addBook("Head First Servlet&Jsp","Wenlong.Meng",99.99); map.addBook("Head First EJB","Dragon",87.00); } } 4>.结果部分
![]() 5、运用java内置观察者模式支持示例:推模式
1、可观察者部分
//MapSeries:extend Observable class import java.util.ArrayList; import java.util.Observable; public class MapSeries extends Observable{ private String name; private String author; private double price; public MapSeries(){} public void autoNotify(){ ArrayList al = new ArrayList(); al.add(name); al.add(author); al.add(price); setChanged(); notifyObservers(al); //notifyObservers();// } public void addBook(String name, String author, double price){ this.name = name; this.author = author; this.price = price; autoNotify(); } /*public String getName(){ return name; } public String getAuthor(){ return author; } public double getPrice(){ return price; }*/ } 2>.观察者部分
//Display interface public interface Display{ public void display(); } //display name and author import java.util.ArrayList; import java.util.Observable; import java.util.Observer; public class NameAndAuthor implements Observer,Display{ Observable observable; private String name; private String author; public NameAndAuthor(Observable observable){ this.observable = observable; observable.addObserver(this); } public void update(Observable obs,Object org){ if(org != null){ name = (String)(((ArrayList)org).get(0)); author = (String)(((ArrayList)org).get(1)); display(); } /*if(obs instanceof MapSeries){ MapSeries map = (MapSeries)obs; this.name = map.getName(); this.author = map.getAuthor(); display(); }*/ } public void display(){ System.out.println("Name: " + name + "\n" + "Author: " + author + "\n"); } } //display name author price import java.util.ArrayList; import java.util.Observable; import java.util.Observer; public class NameAuthorPrice implements Observer,Display{ private String name; private String author; private double price; private Observable observable; public NameAuthorPrice(Observable observable){ this.observable = observable; observable.addObserver(this); } public void update(Observable obs, Object org){ if(org != null){ name = (String)(((ArrayList)org).get(0)); author = (String)(((ArrayList)org).get(1)); price = ((Double)(((ArrayList)org).get(2))).doubleValue(); display(); } /*if(obs instanceof MapSeries){ MapSeries map = (MapSeries)obs; this.name = map.getName(); this.author = map.getAuthor(); this.price = map.getPrice(); display(); }*/ } public void display(){ System.out.println("Name: " + name + "\n" + "Author: " + author + "\n" + "Price: " + String.valueOf(price) + "\n"); } } //display name and price import java.util.Observable; import java.util.Observer; import java.util.ArrayList; public class NameAndPrice implements Observer,Display{ private String name; private double price; private Observable observable; public NameAndPrice(Observable observable){ this.observable = observable; observable.addObserver(this); } public void update(Observable obs,Object org){ if(org != null){ name = (String)(((ArrayList)org).get(0)); price = ((Double)(((ArrayList)org).get(2))).doubleValue(); display(); } /*if(obs instanceof MapSeries){ MapSeries map = (MapSeries)obs; this.name = map.getName(); this.price = map.getPrice(); display(); }*/ } public void display(){ System.out.println("Name: " + name + "\n" + "Price: " + String.valueOf(price) + "\n"); } } 3>.测试部分
//test this application program public class TestObserver{ public static void main(String[] args){ MapSeries map = new MapSeries(); NameAndAuthor na = new NameAndAuthor(map); NameAndPrice np = new NameAndPrice(map); NameAuthorPrice nap = new NameAuthorPrice(map); map.addBook("Head First Design Pattern","BuFuBuXing",98.00); map.addBook("Head First Servlet&Jsp","Wenlong.Meng",99.99); map.addBook("Head First EJB","Dragon",87.00); } } 4>.结果部分
![]() 本文出自 “不服不行” 博客,转载请与作者联系! 本文出自 51CTO.COM技术博客 |






wenlong.meng
博客统计信息
热门文章
最新评论
友情链接
