Java设计模式之适配器模式
前言
适配器模式在我们的开发中接触的比较多的。比如一个很常见的场景,现在有个需求A类要实现B接口,因为B接口里的方法有些我用不到,但是我不得不要重写全部方法,这时候你被逼无奈让你用不到的方法为空;如果这时候出现了个抽象类C,让它实现B接口,然后里面的方法全部重写,再让你的A类实现C类这时候你就可以在不留空方法的前提下选择性的去重写你需要重写的方法,我们把这种模式叫做缺省适配器模式。
缺省适配器模式
假设我们需要实现Targer接口
public interface Targer {
void originProductWork();
void lastProductWork();
void otherWork();
}
定义个抽象类实现Target接口
public abstract class AbsProduct implements Targer {
@Override
public void originProductWork() {
// not handler
}
@Override
public void otherWork() {
System.out.println("some work...");
}
@Override
public void lastProductWork() {
// not handler
}
}
具体的类继承该抽象类,重写需要重写的方法
public class OriginProduct extends AbsProduct {
@Override
public void originProductWork() {
super.originProductWork();
System.out.println("my name is orginProduct....");
}
}
下面还有两种适配器模式也很常用,类适配器是静态的,对象适配器是动态的相对类适配器更加灵活一点,但是还是要结合自己的业务来选择更适合自己的适配器模式;下面举生活中的例子来看看这2种模式,ps:A厂家现在只有3头的插座,但是现在市场需要一批2头同时支持3头的插座,来看看怎么更好的实现这个业务吧。
类适配器模式
该厂家原先的产品OriginProduct
public class OriginProduct {
public void work() {
System.out.println("我是最早的产品,我只支持3头的");
}
}
现在市场需要一批2头同时支持3头的插座,我们可以用一个接口来适配新的产品
public interface Targer {
void originProductWork();
void lastProductWork();
}
最后生成同时支持3头,2头的新产品
public class LastProduct extends
OriginProduct implements Targer {
@Override
public void originProductWork() {
work();
}
@Override
public void lastProductWork() {
System.out.println("我是最新的产品,我支持2头啦");
}
}
对象适配器模式
该模式把旧产品直接包装在新产品里
public interface Targer {
void originProductWork();
void lastProductWork();
}
public interface Targer {
void originProductWork();
void lastProductWork();
}
public final class LastProduct implements Targer {
private OriginProduct originProduct;
public LastProduct(OriginProduct originProduct) {
this.originProduct = originProduct;
}
@Override
public void originProductWork() {
if (originProduct != null) {
originProduct.work();
}
}
@Override
public void lastProductWork() {
System.out.println("我是最新的产品,我支持2头啦");
}
}
如果你觉得不错的话,你还可以看具体的demo哦~