设计模式之适配器模式
我们在实际开发中常常会遇到各个系统对接的问题,而有些类如果轻易改变将影响系统的稳定性。而我们又想达到对接要求,又不想改变代码,那么这个时候适配器就产生了。
适配器模式主要是通过定义一个适配器作为两个不兼容的接口之间的桥梁,将一个类的接口转换为另一个类期望的接口,使得两个类或多个类能一起适应和好的合作
适配器的实现可以依靠依赖的注入或者注解的方式,实现各个接口的功能并达到我们所期望的样子。
在适配器中有三种角色:source、targetable、adapter,source是待适配的类,targetable是目标接口,adapter是适配器,我们通过adapter将source的功能扩展到targetable,以来实现接口的兼容
适配器的实现主要分三类:1.类适配器、2.对象适配器、3.接口适配器
1.类适配器模式
在不改变原有接口或类的结构的情况下扩展类的各种功能以适配不同的接口,可以使用这个类适配模式
source类:
public class Source{
//反射
private final static Log log = LogFatory.getLog(Source.class);
//编辑方法
public void aTextFile() {
log.info ("法外狂徒-张三");
}
}
targetable接口
public interface Targetable {
//定义两个方法
void aTextFile();
void aWordFile();
}
adapter类
public class Adapter extends Source implements Targetable {
//反射
private final static Log log = LogFatory.getLog(Source.class);
//重写方法
@Override
public void aWordFile() {
log.info("江湖猛哥-李四");
}
}
使用适配器
public class Test {
public static void main(String[]agrs){
//面向对象
Targetable t = new Adapter();
t.aTextFile();
t.aWordFile();
}
}
2.对象适配器
这个和类适配器差不多,知识adapter不再继承source类,而是持有它的实例了
适配器
public class DameAdapter implements Targetable {
//反射
private final static Log log = LogFatory.getLog(Source.class);
private Source source;
//方法
public DameAdapter(Source source){
super();
this.source = source;
}
@Override
public void aTextFile() {
this.source.aTextFile();
}
@Override
public void aWordFile() {
log.info("江湖猛哥-李四");
}
}
使用对象适配器:
Source source = new Source();
Targetable t = new DameAdapter(source);
t.aTextFile();
t.aWordFile();
3.接口适配器模式
在不希望实现一个接口中所有的方法时,我们定义一个抽象实现所有方法,在继承改抽象类时,按照我们的需求实现方法即可
Source:
public interface DemoSource{
//定义两个方法
void aTextFile();
void aWordFile();
}
DemoAdapter:
public abstract class DemoAdapter implements DemoSource{
@Override
public void aTextFile() {
};
@Override
public void aWordFile() {
}
}
DemoSource02:
public class DemoSource02 extends DemoAdapter{
//反射
private final static Log log = LogFatory.getLog(Source.class);
//重写方法
@Override
public void aTextFile() {
log.info("法外狂徒-张三");
}
}
DemoSource03:
public class DemoSource03 extends DemoAdapter{
//反射
private final static Log log = LogFatory.getLog(Source.class);
//重写方法
@Override
public void aWordFile() {
log.info("江湖猛哥-李四");
}
}
使用适配器:
public class Test02 {
public static void main(String[]agrs){
DemoSource02 d2 = new DemoSource02 ();
DemoSource03 d3 = new DemoSource03 ();
d2.aTextFile();
d3.aWordFile();
}
}
其实适配器这玩意和多态里面差不多,就那些东西