适配器模式

适配器模式(别名:包装器):将一个类的接口装化成客户希望的另一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

概述

比如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就能对这个新类的实例进行适配。

适配器的使用场景

一个程序想使用已经存在的类,但该类所实现的接口与当前程序所使用的接口不一致。

 

posted @ 2017-04-25 15:31  且听风吟-wuchao  阅读(267)  评论(0编辑  收藏  举报