适配器模式,与我们传统认识里的ListView中使用的Adapter有些不一样,但思想是共通的,通过适配器连接两个毫无关联的类。
适配器模式:
从实现方式上分为两种,- 类适配器 - 对象适配器
这两种的区别在于实现方式上的不同,一种采用继承,一种采用组合的方式。
另外从使用目的上来说,也可以分为两种,- 特殊适配器 - 缺省适配器,这两种的区别在于使用目的上的不同,一种为了复用原有的代码并适配当前的接口,一种为了提供缺省的实现,避免子类需要实现不该实现的方法SimpleAdapter
。
场景:
场景通常情况下是,系统中有一套完整的类结构,而我们需要利用其中某一个类的功能(通俗点说可以说是方法),但是我们的客户端只认识另外一个和这个类结构不相关的接口,这时候就是适配器模式发挥的时候了,我们可以将这个现有的类与我们的目标接口进行适配,最终获得一个符合需要的接口并且包含待复用的类的功能的类。
比如我们在观察者一章中就提到一个问题,就是说观察者模式的一个缺点,即如果一个现有的类没有实现Observer接口,那么我们就无法将这个类作为观察者加入到被观察者的观察者列表中了,这实在太遗憾了。我们希望将HashMap这个类加到观察者列表里,在被观察者产生变化时,假设我们要清空整个MAP。
类适配器:
public class HashMapObserverAdapter<K, V> extends HashMap<K, V> implements Observer{
public void update(Observable o, Object arg) {
//被观察者变化时,清空Map
super.clear();
}
}
随之而来带来了新的问题:如果我们需要继承别的类,由于单继承,我们很难实现,很简单的一个例子,在一个应用的网络请求中我们通常需要分装code,errorMsg等共有的属性,以便处理,如果此时无法再继承其他类,这时候就需要通过组合实现对象适配器:
//我们继承User,组合Observable.
public class ObservableUser extends User{
private Observable observable = new Observable();
public synchronized void addObserver(Observer o) {
observable.addObserver(o);
}
public synchronized void deleteObserver(Observer o) {
observable.deleteObserver(o);
}
public void notifyObservers() {
observable.notifyObservers();
}
public void notifyObservers(Object arg) {
observable.notifyObservers(arg);
}
public synchronized void deleteObservers() {
observable.deleteObservers();
}
protected synchronized void setChanged() {
observable.setChanged();
}
protected synchronized void clearChanged() {
observable.clearChanged();
}
public synchronized boolean hasChanged() {
return observable.hasChanged();
}
public synchronized int countObservers() {
return observable.countObservers();
}
}
们继承User,而不是继承Observable,这个原因刚才已经说过了,我们不能破坏项目中的继承体系,所以现在可观察的User(ObservableUser)依然处于我们实体的继承体系中,另外如果想让ObservableUser具有User的属性,则需要将User的属性改为protected。
这下好了,我们有了可观察的User了。不过LZ早就说过,设计模式要活用,这里明显不是最好的解决方案。因为我们要是还有Person,Employee类都要具有可观察的功能的话,那其实也相当惨,因为下面那些Observable的方法我们还要再复制一遍。
//我们扩展BaseEntity,适配出来一个可观察的实体基类
public class BaseObservableEntity extends BaseEntity{
private Observable observable = new Observable();
public synchronized void addObserver(Observer o) {
observable.addObserver(o);
}
public synchronized void deleteObserver(Observer o) {
observable.deleteObserver(o);
}
public void notifyObservers() {
observable.notifyObservers();
}
public void notifyObservers(Object arg) {
observable.notifyObservers(arg);
}
public synchronized void deleteObservers() {
observable.deleteObservers();
}
protected synchronized void setChanged() {
observable.setChanged();
}
protected synchronized void clearChanged() {
observable.clearChanged();
}
public synchronized boolean hasChanged() {
return observable.hasChanged();
}
public synchronized int countObservers() {
return observable.countObservers();
}
}
这下好了,现在我们的User,Person,Employee要是想具有可被观察的功能,那就改去继承我们适配好的BaseObservableEntity就好了,而且由于BaseObservableEntity继承了BaseEntity,所以他们三个依然处于我们实体的继承体系中,而且由于我们的BaseObservableEntity是新增的扩展基类,所以不会对原来的继承体系造成破坏。对于缺省适配器,可以参考SimpleAdapter
的实现。