-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
83 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
## 察者模式(Observer Pattern) | ||
|
||
### 概述 | ||
> 观察者模式用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。一个软件系统常常要求在某一个对象的状态发生变化的时候,某些其他的对象做出相应的改变。做到这一点的设计方案有很多,但是为了使系统能够易于复用,应该选择低耦合度的设计方案。减少对象之间的耦合有利于系统的复用,但是同时设计师需要使这些低耦合度的对象之间能够维持行动的协调一致,保证高度的协作。观察者模式是满足这一要求的各种设计方案中最重要的一种。 | ||
**概念:** 定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。 | ||
|
||
|
||
### 使用场景 | ||
|
||
一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中使它们可以各自独立地改变和复用。 | ||
|
||
一个对象的改变将导致一个或多个其他对象也发生改变,而并不知道具体有多少对象将发生改变,也不知道这些对象是谁。 | ||
|
||
需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。 | ||
|
||
|
||
|
||
|
||
|
||
### MVC软件框架模型 | ||
|
||
MVC(Model-View-Controller)架构中也应用了观察者模式,MVC是一种架构模式,它包含三个角色:模型(Model),视图(View)和控制器(Controller)。其中模型可对应于观察者模式中的观察目标,而视图对应于观察者,控制器可充当两者之间的中介者。当模型层的数据发生改变时,视图层将自动改变其显示内容 | ||
### 总结 | ||
观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。 | ||
|
||
代码 | ||
``` | ||
public interface Observer { | ||
void update(Subject sub); | ||
} | ||
public abstract class Subject { | ||
private List<Observer> list = new ArrayList<>(); | ||
public void attach(Observer observer) { | ||
list.add(observer); | ||
} | ||
public void detach(Observer observer) { | ||
list.remove(observer); | ||
} | ||
public void modifyObservers() { | ||
for (Observer obs : list) { | ||
obs.update(this); | ||
} | ||
} | ||
} | ||
public class MySubject extends Subject { | ||
private String mState; | ||
public String getmState() { | ||
return mState; | ||
} | ||
public void netProcessChange(String data) { | ||
mState = data; | ||
this.modifyObservers(); | ||
} | ||
} | ||
public class ProgramObserver implements Observer { | ||
@Override | ||
public void update(Subject sub) { | ||
String state = ((MySubject) sub).getmState(); | ||
System.out.println("Programer look the SDK download process is: " + state); | ||
} | ||
} | ||
public class Client { | ||
public static void main(String[] args) { | ||
MySubject mySubject = new MySubject(); | ||
Observer observer = new ProgramObserver(); | ||
mySubject.attach(observer); | ||
mySubject.netProcessChange("1%"); | ||
mySubject.netProcessChange("51%"); | ||
mySubject.netProcessChange("100%"); | ||
} | ||
} | ||
``` |