类的适配器模式
假如需要使用程序中现有的某个类,且该类的接口不符合需求,但该类已经实现好了,为了不影响原有程序,不便对该类本身修改,这时可以用一个新的类继承原来的类,然后在新的类中去重载原来类的某些方法或添加一些新的方法。代码如下:
原有的类:
public
class
Person {
private String name;
private String sex;
private int age;
public void speakMyJapanese(){
System. out .println( "I can speak Japanese!" );
}
public void speakMyEnglish(){
System. out .println( "I can speak English!" );
}
}
private String name;
private String sex;
private int age;
public void speakMyJapanese(){
System. out .println( "I can speak Japanese!" );
}
public void speakMyEnglish(){
System. out .println( "I can speak English!" );
}
}
适配器接口:
public
interface
Job {
public abstract void speakJapanese();
public abstract void speakEnglish();
public abstract void speakFrench();
}
public abstract void speakJapanese();
public abstract void speakEnglish();
public abstract void speakFrench();
}
适配器:
public
class
Adapter extends Person implements Job{
public void speakJapanese () {
public void speakJapanese () {
....
speakMyJapanese();
....
}
}
public
void
speakEnglish
() {
....
speakMyEnglish();
....
}
}
public
void
speakFrench() {
....
}
}
对象的适配器模式
不再继承原来的类,而是把原来的类作为新类的一个成员变量,这样可以通过该成员变量调用原来的方法,下面只给出适配器的代码:
public
class
Adapter implements Job {
Person person;
public Adapter(Person person) {
this .person = person;
}
public void speakEnglish() {
person.speakEnglish();
}
public void speakJapanese() {
person.speakJapanese();
}
//new add
public void speakFrench() {
Person person;
public Adapter(Person person) {
this .person = person;
}
public void speakEnglish() {
person.speakEnglish();
}
public void speakJapanese() {
person.speakJapanese();
}
//new add
public void speakFrench() {
...
}
}
}
}
类适配器与对象适配器比较
类的适配模式用于单一源的适配(一个类只能继承一个父类),由于它的源的单一,代码实现不用写选择逻辑,很清晰;而对象的适配模式则可用于多源的适配(可以包含多个类类型的成员变量),弥补了类适配模式的不足,使得原本用类适配模式需要写很多适配器(一个源类对应一个适配器)的情况不复存在,弱点是,由于源的数目可以较多,所以具体的实现条件选择分支比较多,不太清晰。
版权声明:本文为博主原创文章,未经博主允许不得转载。