← 返回首页
设计模式基础教程(十五)
发表时间:2021-08-23 07:55:23
适配器模式

1.适配器模式

适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器(Adapter),它所包装的对象就是适配者(Adaptee),即被适配的类。

适配器提供客户类需要的接口,适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作。这就是适配器模式的模式动机。

适配器模式包含如下角色: - Target:目标抽象类 - Adapter:适配器类 - Adaptee:适配者类 - Client:客户类

2.实例

现需要设计一个可以模拟各种动物行为的机器人,在机器人中定义了一系列方法,如机器人叫喊方法cry()、机器人移动方法move()等。如果希望在不修改已有代码的基础上使得机器人能够像狗一样叫,像狗一样跑,也可以让机器人像鸟一样叫,像鸟一样飞行,使用适配器模式进行系统设计。

项目结构图如下:

定义机器人接口

public interface Robot {
    void cry();
    void move();
}

定义小狗和小鸟类

//Dog.java
public class Dog {

    public void bark(){
        System.out.println("狗汪汪叫....");
    }
    public void run(){
        System.out.println("狗快快跑...");
    }
}

//Bird.java
public class Bird {
    public void tweedle(){
        System.out.println("鸟儿叽叽叫...");
    }
    public void fly(){
        System.out.println("鸟儿快快飞...");
    }
}

定义小狗和小鸟的适配器类

//DogAdapter.java
public class DogAdapter extends Dog implements Robot {

    @Override
    public void cry() {
        System.out.println("机器人模仿:");
        super.bark();
    }
    @Override
    public void move() {
        System.out.println("机器人模仿:");
        super.run();
    }
}

//BirdAdapter.java
public class BirdAdapter extends Bird implements Robot {
    @Override
    public void cry() {
        System.out.println("机器人模仿:");
        super.tweedle();
    }
    @Override
    public void move() {
        System.out.println("机器人模仿:");
        super.fly();
    }
}

XML解析工具类


import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;

public class XMLUtils {

    public static Object getBean(){
        DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();
            Document doc=documentBuilder.parse(XMLUtils.class .getClassLoader().getResourceAsStream("config.xml"));
            String className=doc.getElementsByTagName("className").item(0).getTextContent();

            return Class.forName(className).newInstance();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
}

配置文档

<?xml version="1.0"?>
<config>
    <!-- <className>com.simoniu.domain.DogAdapter</className> -->
    <className>com.simoniu.domain.BirdAdapter</className>
</config>

测试类

public class TestAdapterDemo01 {
    public static void main(String[] args) {
        Robot robot=(Robot) XMLUtils.getBean();
        robot.cry();
        robot.move();
    }
}

运行结果:
机器人模仿:
鸟儿叽叽叫...
机器人模仿:
鸟儿快快飞...