设计模式-结构型设计-适配器模式

3.1 适配器模式

  1. 模式动机与定义

    • 模式动机

      • 现实生活
        • 不兼容 生活用电220V --- 笔记本电脑 20V
        • 引入 AC Adapter(交流电适配器)
      • 软件开发
        • 存在不兼容的结构,例如方法名不一致
        • 引入适配器模式
    • 模式定义

      • 讲一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作
      • 适配器模式既可以作为类结构型模式,也可以是对象结构型模式
      • 定义中所提及的接口是广义的接口,它可以表示一个方法或者方法的集合
  2. 模式结构与分析

    • 模式结构

      • 类适配器

        • 适配器类继承适配者类 并调用适配者业务方法
      • 对象适配器 使用频率更高 更加灵活 (一个类只有一个父类)

        • 适配器和和适配者关联关系 适配者作为对象
      • 适配器模式包含如下角色

        • Target :目标抽象类
        • Adapter:适配器类
        • Adaptee:适配者类
    • 模式分析

  3. 模式实例与解析

    • 模式实例
    • 模式解析
  4. 模式效果与应用

    • 模式优点

      • 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构,符合开闭原则
      • 增加了类的透明性和复用性,提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用
      • 灵活性和扩展性非常好
      • 类适配器模式:置换一些适配者的方法很方便
      • 对象适配器:可以把多个不同的适配者适配到同一个目标,还可以适配一个适配者的字类
    • 模式缺点

      • 类适配器模式:

        • (1)一个最多只能适配一个适配者类,不能同时适配多个适配者
        • (2)适配者类不能为最终类
        • (3)目标抽象类只能为接口,不能为类
      • 对象适配器:在适配器中置换适配者类的某些方法比较麻烦

    • 应用场景:

      • 系统需要使用一些现有的类,而这些类的接口不符合系统的需要,甚至没有这些类的源代码
      • 常见一个可以重复使用的类,用于核一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作
interface Adaptee {
    void writeLog();
    
}
public interface ILog {
    void write();

}
class DatabaseLog implements ILog,Adaptee {

    @Override
    public void write() {
        // TODO Auto-generated method stub
        System.out.println("DatabaseLog write");
    }

    @Override
    public void writeLog() {
        // TODO Auto-generated method stub
        System.out.println("DatabaseLog writeLog");
    }

}

class FileLog implements ILog,Adaptee {

    @Override
    public void write() {
        // TODO Auto-generated method stub
        System.out.println("FileLog write");
    }

    @Override
    public void writeLog() {
        // TODO Auto-generated method stub
        System.out.println("FileLog writeLog");
        
    }

}

class Log {
    
    
    ILog iLog = (ILog) XMLUtil.getBean();
    void write() {
        iLog.write();
    }
    
}

class Adapter extends Log {
    Adaptee adaptee = (Adaptee) XMLUtil.getBean();
    @Override
    void write() {
        // TODO Auto-generated method stub
        adaptee.writeLog();
    }

}

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XMLUtil {
    static Object getBean() {
        try {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbFactory.newDocumentBuilder();
            Document doc ;
            doc = db.parse("./src/adapter_pattern/config.xml");
            
            NodeList nList = doc.getElementsByTagName("className");
            Node node = nList.item(0).getFirstChild();
            String className = node.getNodeValue();
            
            Class c = Class.forName(className);
            Object o = c.newInstance();
            return o;

        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            return null;
        }
        
    }


    

}

public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Log log = new Adapter();
        log.write();
    }

}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容