适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够放在一起工作。(也有人把这种模式称为叫做包装(Wrapper)模式)
适配器模式有以下角色:
Target(目标)
Adaptee(源)
Adapter(适配器)
1:类的适配器模式
2:对象的适配器模式
public interface Target {
public void doSomething1();
// Adaptee中没有的方法
public void doSomething2();
}
public class Adaptee {
public void doSomething1() {
}
}
/**
* 类的适配器模式
*/
public class Adapter extends Adaptee implements Target {
// Adaptee中没有方法doSomething2,因此适配器类补充此方法
@Override
public void doSomething2() {
// Write your code here
}
}
类的适配器模式。使用一个具体类把源(Adaptee)适配到目标(Target)。这样一来,如果源以及源的子类都使用此类适配,就行不通了。由于适配器(Adapter)是源的子类,因此可以在适配器类中置换掉(Ovveride)源的一些方法。由于只引进了一个适配器类,因此只有一个路线到达目标类,使问题得到简化。
public interface Target {
public void doSomething1();
// Adaptee中没有的方法
public void doSomething2();
}
public class Adaptee {
public void doSomething1() {
}
}
/**
* 对象的适配器模式
*/
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
super();
this.adaptee = adaptee;
}
@Override
public void doSomething1() {
adaptee.doSomething1();
}
// Adaptee中没有方法doSomething2,因此适配器类补充此方法
@Override
public void doSomething2() {
// Write your code here
}
}
对象的适配器模式。一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类都适配到目标接口;与类的适配器模式相比,要想置换源类的方法就不容易。如果一定要置换掉源类的一个或多个方法,就只好先做一个源类的子类,将源类的方法置换掉,然后再把源类的子类当做真正的源进行适配;虽然要想置换源类的方法不容易,但是要想增加一些新的方法则方便得很,而且新增加的方法可同时适用于所有的源。
1:系统需要使用现有的类,而此类的接口不符合系统的需要。
2:想要建立一个可以重复使用的类 ,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这个源类不一定有很复杂的接口。
3:(对对象的适配器模式而言)在设计里,需要改变多个已有的子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器类,而这个不太实际。
在很多情况下,必须让一个具体类实现某一个接口,但是这个类又用不到接口所规定的所有的方法。通常的处理方法是,这个具体类要实现所有的方法,那些有用的方法要有实现,那些没有用的方法也要有空的、平庸的实现。
/**
* 在Android中,控件TextView添加监听,常用匿名类的方式实现。但是大多数情况下
* 只会使用TextWatcher中的afterTextChanged方法。
*/
textView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
用缺省适配模式之后如下:
/**
* 用一个具体类实现TextWatcher的所有的方法。
*/
public class SimpleTextWatcher implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
}
}
textView.addTextChangedListener(new SimpleTextWatcher() {
@Override
public void afterTextChanged(Editable s) {
super.afterTextChanged(s);
// 逻辑
}
});