适配器模式
适配器模式(别名:包装器):将一个类的接口装化成客户希望的另一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
概述
比如A型螺母可以使用A型螺丝,B型螺母可以使用B型螺丝,现在需要在A型螺母上使用B型螺丝,这时必须使用适配器。
模式的结构
目标(Target):一个接口,该接口是客户想使用的接口
被适配者(Adaptee):被适配者是一个已经存在的接口或抽象类
适配器(Adapter):一个类,该类实现了目标接口并包含被适配者的引用。
模式的使用
一个两孔插座对应电视机插头,一个三孔插座对应洗衣机插头。现在我们想使用新的三孔插座来使用电视机和洗衣机。
目标(Target):TreeOutlet.java
/** * 目标 */ public interface TreeOutlet { public abstract void connect(); }
被适配者:TwoOutlet.java
/** * 被适配者 */ public interface TwoOutlet { public abstract void connect(); }
适配器:TreeOutletAdapter.java
/** * 适配器 */ public class TreeOutletAdapter implements TreeOutlet{ TwoOutlet outlet; TreeOutletAdapter(TwoOutlet outlet){ this.outlet=outlet; } public void connect(){ outlet.connect(); } }
程序应用
洗衣机类
/** * 洗衣机 */ public class Wash implements TreeOutlet{ String name; Wash(){ name="骆驼牌洗衣机"; } Wash(String name){ this.name=name; } public void connect(){ turnOn(); } public void turnOn(){ System.out.println(name+"开始洗衣服"); } }
电视机类
/** * 电视机 */ public class TV implements TwoOutlet{ String name; TV(){ name="熊猫牌电视机"; } TV(String name){ this.name=name; } public void connect(){ turnOn(); } public void turnOn(){ System.out.println(name+"开始播放节目"); } }
应用
/** * 应用程序 */ public class Application { public static void main(String[] args){ //目标接口,三孔插座 TreeOutlet outlet; Wash wash = new Wash(); outlet = wash; //洗衣机使用三孔插座 outlet.connect(); TV tv = new TV(); //把电视插在适配器上适配器 TreeOutletAdapter adapter = new TreeOutletAdapter(tv); //把适配器插在三孔插座上 outlet = adapter; //电视接通三孔插座 adapter.connect(); } }
适配器模式的优点
- 目标和被适配者完全解耦合
- 满足“开-闭原则”。当添加一个实现Adaptee接口的新类时,不必要修改Adapter,Adapter就能对这个新类的实例进行适配。
适配器的使用场景
一个程序想使用已经存在的类,但该类所实现的接口与当前程序所使用的接口不一致。
联系方式:wuchaodzxx@126.com