### 观察者模式
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。(摘抄)
观察者模式可以大大的降低类与类之间的耦合,同时又能保持一些对象改变的一致性。
观察者模式把相互调用的类,抽象成了两个部分,它们之间互不干扰,可以各自独立的改变和使用,其中一个部分依赖于另一个部分的抽象,当一个部分改变时,可以通知另一个部分及时发生改变。
~~~
import java.util.ArrayList;
abstract class Subject
{
private ArrayList<Observer> list = new ArrayList<Observer>();
private String subjectState;
public void Attach(Observer observer)
{
}
public void Detach(Observer observer)
{
}
public void Notify()
{
for (Observer o : list)
{
o.update();
}
}
}
interface Observer
{
void update();
}
class ConcreteSubject1 extends Subject
{
public void Notify()
{
System.out.println("abcd");
}
}
class ConcreteSubject2 extends Subject
{
public void Notify()
{
System.out.println("bcde");
}
}
class ConcreteObserver1 implements Observer
{
private Subject subject;
public ConcreteObserver1(Subject subject)
{
this.subject = subject;
}
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("1"+subject);
}
}
class ConcreteObserver2 implements Observer
{
private Subject subject;
public ConcreteObserver2(Subject subject)
{
this.subject = subject;
}
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("2"+subject);
}
}
class Client
{
public static void main()
{
Subject subject = new ConcreteSubject1();
subject.Attach(new ConcreteObserver1(subject));
subject.Attach(new ConcreteObserver2(subject));
subject.Notify();
//更换主题类
// Subject subject = new ConcreteSubject2();
//
// subject.Attach(new ConcreteObserver1(subject));
// subject.Attach(new ConcreteObserver2(subject));
//
// subject.Notify();
}
}
~~~
话说我感觉这一章这本书好像没怎么讲明白,所以感觉自己说呢也没有说明白,不过差不多理解什么意思了,我感觉树上前面的代码完全就还是耦合的,还是在ConcreteObserver类中调用了ConcreteSubject类,它没有用到抽象的类,我感觉可能书上弄错了。
观察者模式优点:就是类与类之间依赖的是抽象对象,而不是具体对象,当具体对象更改时对于整个代码是没有影响的,同时是多个对象依赖于一个抽象对象,当对象状态发生变化时通知其它对象发生相应的改变比较方便
观察者模式缺点:抽象通知者依赖的是抽象观察者,当抽象观察者产生的时间在抽象通知者之后,那么就没有update方法给抽象观察者调用了。
### 委托
用委托的方法可以解除掉观察者模式的缺点,在c#中有委托这种用法,在java中就要使用到动态代理,需要理一理思路,查一查文章,等下再写一篇专门说java动态代理的吧
- 前言
- (1)代码无错就是优?——简单工厂模式
- (2)商场促销——策略模式
- (3)&amp;(4)&amp;(5) 设计模式原则
- (6)穿什么有这么重要?——装饰模式
- (7)为别人做嫁衣——代理模式
- (8)雷锋依然在人间——工厂方法模式
- (9)简历复印——原型模式
- (10)考题抄错会做也白搭——模板方法模式
- (11)迪米特法则
- (12)牛市股票还会亏钱?—— 外观模式
- (13)好菜每回味不同——建造者模式
- (14)老板回来,我不知道——观察者模式
- java实现事件委托
- (15)就不能不还DB吗?—— 抽象工厂模式
- (16)无尽加班何时休息——状态模式
- (17)在NBA我需要翻译——适配器模式
- (18)如果再回到从前——备忘录模式
- (19)分公司=部门——组合设计模式
- (20)想走?可以!先买票——迭代器模式
- (21)有些类也需计划生育——单例模式
- (22)手机软件何时统一——桥接模式
- (23)烤羊肉串引来的思考——命令模式
- (24)加薪非要老总批?——职责链模式
- (25)世界需要和平——中介者模式
- (26)项目多也别傻做——享元模式
- (28)男人和女人——访问者模式