观察者模式
当对象间存在一对多的关系时,则使用观察者模式(Observer Patterm)。 例如:当前对象被修改时这会通知依赖它的对象。观察者模式属于行为型模式。
介绍
意图:定义对象之间的一种对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并且被自动更新。
主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用性和低耦合,保证高度的协作。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
如何解决当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
如何解决:使用面向对象技术,可以将这种关系弱化。
关键代码:在抽象类中有一个ArrayList存放观察者。
应用实例:
- 拍卖时,拍卖师观察最高标价,然后通知其他竞价者竞价。
- 菩萨通过洒水招来老乌龟,老乌龟就是观察者,观察菩萨的洒水动作
优点:
- 观察者和被观察者是抽象耦合的。
- 建立一套触发机制
缺点:
- 如果一个被观察者对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
- 如果观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
- 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅知道观察目标发送变化。
使用场景:
一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装到独立的对象中使它们可以各自独立的改变和复用。
一个对象的改变将导致一个或多个对象也发生改变,而不知道有多少对象改变,可以降低对象之间的耦合度。
一个对象必须通知其他对象,而不知道这个对象时谁。
需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……。可以使用观察者模式创建一种链式触发机制。
谁是观察者谁是被观察者?
当你做出了某些动作另一个人根据你的动作做出某些行为,这时你就是被观察者,另一个人是观察者。
订阅-发布模式
订阅-发布模式是观察者模式的另一个别称。
但是随着时间的变化,已经独立于观察者模式,成为另一种的设计模式。
在现在的发布订阅模式中,成为发布者的消息发送者不会将信息直接发送给订阅者,这意味这发布者和订阅者不知道彼此的存在。在发布者和订阅者之间存在第三个组件,称为调度中心或事件通道,它维持着发布者和订阅者之间的联系,过滤所有发布者传入的信息并相应的分发给它的订阅者。
例子:
你在微博关注了A,同时其他很多人也关注了A,那么当A发布动态的时候,微博就会为你推送这条动态。A就是发布者,你是订阅者,微博就是调度中心,你和A之间没有直接的消息往来,全是通过微博来协调的。
委托模式
介绍
委托模式(delegation pattern)是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。
简单的Java例子
在这个例子里,类模拟打印机Printer拥有针式打印机RealPrinter的实例,Printer拥有的方法print()将处理转交给RealPrinter的方法print()。
class RealPrinter { // the "delegate"
void print() {
System.out.print("something");
}
}
class Printer { // the "delegator"
RealPrinter p = new RealPrinter(); // create the delegate
void print() {
p.print(); // delegation
}
}
public class Main {
// to the outside world it looks like Printer actually prints.
public static void main(String[] args) {
Printer printer = new Printer();
printer.print();
}
}
参考