定义:将一个类的接口,转换成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间。
类型:结构型模式
类结构图:
代码实现:
1 public interface Duck { 2 3 public void quack(); 4 5 public void fly(); 6 } 7 8 public class Adapter implements Duck{ 9 10 private Dog dog; 11 12 public Adapter(Dog dog){ 13 this.dog=dog; 14 } 15 @Override 16 public void quack() { 17 dog.bark(); 18 } 19 20 @Override 21 public void fly() { 22 dog.jump(); 23 } 24 } 25 26 public class Dog{ 27 28 public void bark() { 29 System.out.println("狗汪汪叫。。。。。。。。"); 30 } 31 32 public void jump() { 33 System.out.println("狗跳。。。。。。"); 34 } 35 } 36 37 38 public class Test { 39 public static void main(String[] args) { 40 Dog dog=new Dog(); 41 Adapter duck=new Adapter(dog); 42 //把狗包装成具有鸭子的行为 43 duck.fly(); 44 duck.quack(); 45 } 46 }
适配器模式的优点:
1 通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。
2 复用了现存的类,解决了现存类和复用环境要求不一致的问题。
3 将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
4 一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。
适配器模式的缺点:
1对于对象适配器来说,更换适配器的实现过程比较复杂。
适用场景:
1 系统需要使用现有的类,而这些类的接口不符合系统的接口。
2 想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
3 两个类所做的事情相同或相似,但是具有不同接口的时候。
4 旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。
5 使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。