本人所学设计模式皆出自于 结城浩先生的《图解设计模式》。
Adapter模式也被成为Wrapper模式
类图
类适配器模式
对象适配器模式
为什么使用Adapter模式
当现有的类已经被充分测试过,bug很少,而且已经被用于其他软件之中,我们更愿意对这些类作为组件重复利用,Adapter模式会对现有的类进行适配,生成新的类。通过该模式我们可以方便的创建我们需要的方法群,当出现bug时,由于我们很明确bug不是现有的类,所以只需要调查Adapter即可,代码问题排查也会非常简单。
举例代码
类适配器
package com.qiang.model;
/**
* 已经存在的人类
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class Person {
protected void singing() {
System.out.print("singing");
}
protected void dancing() {
System.out.print("dancing");
}
}
package com.qiang.demand;
/**
* 需求接口
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public interface Human {
/**
* 唱歌和跳舞
*/
void singingAndDancing();
/**
* 跳舞和唱歌
*/
void dancingAndSinging();
}
package com.qiang;
import com.qiang.demand.Human;
import com.qiang.model.Person;
/**
* 适配器
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class Adapter extends Person implements Human {
@Override
public void singingAndDancing() {
singing();
System.out.println(" And Dancing");
}
@Override
public void dancingAndSinging() {
dancing();
System.out.println(" And Singing");
}
}
package com.qiang;
import com.qiang.demand.Human;
/**
* 测试
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class Test {
public static void main(String[] args) {
Human human = new Adapter();
human.dancingAndSinging();
human.singingAndDancing();
}
}
结果
dancing And Singing
singing And Dancing
对象适配器
package com.qiang.demand;
/**
* 需求
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public abstract class AbstractHuman {
/**
* 唱歌和跳舞
*/
public abstract void singingAndDancing();
/**
* 跳舞和唱歌
*/
public abstract void dancingAndSinging();
}
package com.qiang.model;
/**
* 已经存在的人类
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class Person {
public void singing() {
System.out.print("singing");
}
public void dancing() {
System.out.print("dancing");
}
}
package com.qiang;
import com.qiang.demand.AbstractHuman;
import com.qiang.model.Person;
/**
* 适配器
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class Adapter extends AbstractHuman {
private Person person;
public Adapter() {
this.person = new Person();
}
@Override
public void singingAndDancing() {
person.singing();
System.out.println(" And Dancing");
}
@Override
public void dancingAndSinging() {
person.dancing();
System.out.println(" and Singing");
}
}
package com.qiang;
import com.qiang.demand.AbstractHuman;
/**
* 测试
*
* @author zhangxinqiang
* @date 2018/2/10
*/
public class Test {
public static void main(String[] args) {
AbstractHuman human = new Adapter();
human.singingAndDancing();
human.dancingAndSinging();
}
}
结果
singing And Dancing
dancing and Singing
我通过2种方式对Person类到Human/AbstractHuman类进行了适配或者说包装,在通过调用已存在的类完成新需求的情况下并没有对原有的类进行修改,通过这种方式完成了代码的复用,更安全,并且有效减少bug量及代码冗余。