Adapter Pattern 适配器模式的定义如下:
Convert the interface of a class into another interface clients expect. Adatper lets classes work together that couldn't otherwise because of incompatiable interfaces
将一个类的接口变换成客户端所期待的另一个接口,从而使原本因为接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器模式又叫变压器模式,也叫包装模式,包装模式还包括装饰模式。
适配器模式的三个角色:
1,Target目标角色,定义把其它类转换成何种接口,也就是我们的期望接口。
2,Adaptee源角色,你想把谁转换成目标角色
3,Adapter适配器角色,核心角色,职责非常简单:把源角色转换成目标角色,怎么转换呢。一般通过继承或者类关联的方式。
模板代码:
public interface ITarget { public void request(); }
public class Target implements ITarget { @Override public void request() { System.out.println("if you need any help, pls call me!"); } }
public class Source { // 原有的业务逻辑 public void doSomething() { System.out.println("I'm kind of busy, leave me alone, pls"); } }
public class Adapter extends Source implements ITarget { @Override public void request() { super.doSomething(); } }
最后是场景应用类:
public class Client { public static void main(String[] args) { // 原有的业务逻辑 ITarget target = new Target(); target.request(); // 增加适配器后的业务逻辑 ITarget target1 = new Adapter(); target1.request(); } }
适配器模式的优点:
1,适配器模式可以让两个没有任何关系的类在一起运行
2,增加了类的透明性
3,提高了类的复用度
4,灵活性非常好
适配器模式使用场景:
只要记住一点就够了:你有动机修改一个已经投入生产中的接口,记住是已经投入了生产,适配器模式可能是你最适合的模式。
注意:项目一定要遵守依赖倒置原则和李氏替换原则(说白了就是面向抽象和接口编程),否则即使在适合使用适配器模式的场景下也会带来非常大的改造。
适配器模式的扩展:
之前我们将的是Source接口只有一个的情况,如果有多个怎么办,那么我们可以利用聚合的方法,在Adapter里面放几个Source的接口,然后在构造函数中传递真正的Source对象,Adapter还是继承自Target,只不过之后将Target接口方法的实现委托给内部的几个Source对象来处理,也称委托模式。
前面一种通过继承的叫类适配模式器,而后面的通过聚合的叫对象适配模式器。
实际项目中,对象适配器使用最多,因为组合优于继承,灵活性更高一点。
最佳实践:
适配器模式是一个补偿模式,或者说是一个不就模式,在完美设计中不会使用到。不过再完美的设计也会有想不到的地方,需求变更无止境。适配器模式通过把非本系统接口的对象包装成本系统可以接受的对象,从而简化了系统大规模变更风险的存在。
本人博客已搬家,新地址为:http://www.pycoding.com/