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();
}
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();
}
}
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);
}
public interface Observer{
public void update(String name,String author,double price);
}
//Display interface
public interface Display{
public void display();
}
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);
}
}
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));
}
}
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");
}
}
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);
}
}
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;
}
}
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);
}
}
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");
}
}
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));
}
}
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);
}
}
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;
}*/
}
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();
}
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");
}
}
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");
}
}
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");
}
}
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);
}
}
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>.结果部分
转载于:https://blog.51cto.com/bufubuxing/67851