我对设计模式的理解:
多数开发人员应该知道设计模式这个东西;部分人知道23种设计模式;少数人能够熟练使用设计模式,极少数人精通设计模式。
其实23种设模式,其实只是入门,这就相当于你学英语,学会了26个英文字母,才能开始学习单词。同样23种设计模式,只是字母表,想要到精通的层次,要能够灵活的使用设计模式,灵活的组合设计模式。
设计模式是我短期计划中的一部分,我的文章致力于最快最简单的掌握每一个设计模式。
我的设计模式相关的文章,都会在开篇使用一句话,来描述一个设计模式!
该模式设计关键点
观察者模式,关注的是当一个类状态改变时,其它与之关联的多个类如何捕获到这个变化,并做出一些操作。
UML图
大家要逐渐的接受这种面向接口编程的思想。面向接口编程,更容易扩展。简单的解释一下上边的UML图,首先要知道两个概念,一个是主题(topic),一个是订阅者。这两个在设计模式里边代表的是不同的类。主题类的接口一般会有这么几个方法:添加订阅者的方法,移除订阅者的方法,以及当状态改变时,通知订阅者做出对应的动作。
代码案例
定义主题类接口,声明添加观察者,删除观察者,以及通知观察者发生变化的三个方法。 这个接口如果不需要扩展,则可以省略。不写也没有问题。
public interface Subject {
//增加一个观察者
public void addObserver(Observer observer);
//删除一个观察者
public void deleteObserver(Observer observer);
//通知所有观察者
public void notifyObserver();
}
主题类实现接口,并实现了被观察者声明的方法。
public class SubjectImpl implament Subject {
//观察者数组
private Vector oVector = new Vector();
//增加一个观察者
public void addObserver(Observer observer) {
this.oVector.add(observer);
}
//删除一个观察者
public void deleteObserver(Observer observer) {
this.oVector.remove(observer);
}
//通知所有观察者
public void notifyObserver() {
for(Observer observer : this.oVector) {
observer.update("敌人来了!!!");
}
}
}
定义观察者接口,声明了接受变化消息,做出一系列动作的方法。在这里,需要说明一下,这里定义一个接口的意义非常大,因为不同类型的观察者,只需要实现这个定义观察者接口就可以了。
public interface Observer {
//更新
public void update(Object changeMess);
}
观察者实现类,这个是炮兵类
public class ObserverArtilleryImpl implements Observer {
@Override
public void update(Object changeMess) {
//根据变化的对象做出一些操作
// do changeMess
system.out.print("得到消息" + changeMess)
system.out.print("装弹准备" )
}
}
观察者类,这是一个步兵类
public class ObserverInfantryImpl implements Observer {
@Override
public void update(Object changeMess) {
//根据变化的对象做出一些操作
// do changeMess
system.out.print("得到消息" + changeMess)
system.out.print("步兵注意隐蔽,准备射击" )
}
}
下边是一个使用的案例:其中被观察者就像是指挥官,而观察者就像是不同的作战部队,观察者等着指挥官发布命令,然后执行命令。
public class Client {
public static void main(String[] args) {
//创建一个主题
Subject subject = new SubjectImpl();
//定义一个观察者
Observer observerInfantry = new ObserverInfantryImpl();
//定义一个观察者
Observer observerArtillery = new ObserverArtilleryImpl();
//添加观察者-步兵
subject.addObserver(observerInfantry );
//添加观察者-炮兵
subject.addObserver(observerArtillery);
// 发布命令,通知所有观察者
subject.notifyObserver();
}
}
补充
观察者模式,应该说有两种形式,一种是主动推消息给观察者。一种是被观察者提供数据接口,由观察者来轮询。上边的案例是主动推消息的一种形式。
这两种模式各有利弊,如果是主动推,可能有时候观察者并不关心变化的数据,从而造成了资源的浪费。而观察者轮询的方式,会有被观察者始终没有变化,观察者又会白白轮询的情况,也是浪费资源。所以使用的时候还是要灵活使用,并不是死板的。
个人理解
观察者模式,也叫做发布订阅者模式。本身放在设计模式里边来说的话,主要是用来描述类与类之间的关系的。关乎到类的动作的,都是行为模式。
消息队列的设计和观察者模式非常的类似。其实在功能上,也实现了发布与订阅的作用。但是注意它是一种中间件能力。严格意义上不算设计模式。