1. 什么是观察者模式(Observer)?
观察者模式在java中是一个非常重要的设计模式。就像它的名字一样,是用来观察事物的。被观察的对象被称为主题,观察主题的对象被称为观察者。
2. 观察者模式用来解决哪些问题?
如果一个特定的对象的状态改变,随之对应的一组对象自动改变自己的状态。通过实现观察者模式来实现对象之间的耦合。
3.在java中怎么实现观察者模式?
在java中我们可以很容易的实现观察者模式。在java.util包中我们可以找到实现此模式的接口、类和方法。
Public Interface Observer
当主题改变时,任何实现此接口的对象将被通知。Update (Observable Ob, Object arg)方法被调用。
Class Observable:
观察者要观察的对象
一些重要的方法
addObserver(Observer o):为主题添加观察者
deleteObserver(Observer o):删除观察者
hasChanged():检查主题状态是不是改变
clearChanged():表示主题是否改变或者主题改变是否已经通知所有的观察者
notifyObservers(): 当主题改变时通知所有的观察者
你可以选择jdk提供的提供的类和接口或者自己写你的主题和观察者的接口,我更倾向于自己实现,应为这也不是很麻烦,而且比jdk提供的更为灵活
4. 观察者模式的优点:
观察者模式的主要优点就是主题和观察者直接的松耦合。主题只需要知道观察者的一个列表,不用关心那些观察者是如何实现。主题通过广播的方式通知观察者
5. 观察者模式的缺点
使debug变得困难
因为主题保持了所有观察者的引用,如果我们不删除观察者,有可能造成内存问题。
观察者模式在java中是一个非常重要的设计模式。就像它的名字一样,是用来观察事物的。被观察的对象被称为主题,观察主题的对象被称为观察者。
2. 观察者模式用来解决哪些问题?
如果一个特定的对象的状态改变,随之对应的一组对象自动改变自己的状态。通过实现观察者模式来实现对象之间的耦合。
3.在java中怎么实现观察者模式?
在java中我们可以很容易的实现观察者模式。在java.util包中我们可以找到实现此模式的接口、类和方法。
Public Interface Observer
当主题改变时,任何实现此接口的对象将被通知。Update (Observable Ob, Object arg)方法被调用。
Class Observable:
观察者要观察的对象
一些重要的方法
addObserver(Observer o):为主题添加观察者
deleteObserver(Observer o):删除观察者
hasChanged():检查主题状态是不是改变
clearChanged():表示主题是否改变或者主题改变是否已经通知所有的观察者
notifyObservers(): 当主题改变时通知所有的观察者
你可以选择jdk提供的提供的类和接口或者自己写你的主题和观察者的接口,我更倾向于自己实现,应为这也不是很麻烦,而且比jdk提供的更为灵活
interface Observer{
public void update(float intrest);
}
interface Subject{
public void registerObserver(Observer observer);
public void deleteObserver(Observer observer);
public void notifyObervers();
}
import java.util.*;
public class Loan implements Subject{
private ArrayList<Observer> observers = new ArrayList<Observer>();
private String type;
private String bank;
private float intrest;
public Loan(String type,String bank,float intrest){
this.type = type;
this.bank = bank;
this.intrest = intrest;
}
public float getIntrest(){
return this.intrest;
}
public void setIntrest(float intrest){
this.intrest = intrest;
}
public String getBank() {
return this.bank;
}
public String getType() {
return this.type;
}
public void registerObserver(Observer observer){
observers.add(observer);
}
public void deleteObserver(Observer observer){
observers.remove(observer);
}
public void notifyObervers(){
for(Observer observer:observers){
System.out.println("Notifying Observers on change in Loan interest");
observer.update(this.intrest);
}
}
}
public class Newspaper implements Observer {
public void update(float interest) {
System.out.println("Newspaper: Interest Rate updated, new Rate is: "
+ interest);
}
}
public class Internet implements Observer {
public void update(float interest) {
System.out.println("Internet: Interest Rate updated, new Rate is: "
+ interest);
}
}
public class ObserverTest {
public static void main(String args[]) {
// this will maintain all loans information
Newspaper printMedia = new Newspaper();
Internet onlineMedia = new Internet();
Loan personalLoan = new Loan("Personal Loan","Standard Charterd",12.5f);
personalLoan.registerObserver(printMedia);
personalLoan.registerObserver(onlineMedia);
personalLoan.setIntrest(3.5f);
personalLoan.notifyObervers();
}
}
4. 观察者模式的优点:
观察者模式的主要优点就是主题和观察者直接的松耦合。主题只需要知道观察者的一个列表,不用关心那些观察者是如何实现。主题通过广播的方式通知观察者
5. 观察者模式的缺点
使debug变得困难
因为主题保持了所有观察者的引用,如果我们不删除观察者,有可能造成内存问题。