设计模式之适配器模式
设计模式之适配器模式
之前学过一次,但不是很理解,示例用的电压不同做适配,总是感觉不对劲,有种很模糊的感觉。今天看《研磨设计模式》,利用日志系统的兼容来讲解适配器模式,感觉很清晰
书中总结的很到位:转换匹配,复用功能
先画个UML

对象适配器
先说一下角色
Target:新的接口
/**
 * @author lc
 * @date 2020-12-22 9:32
 * 老的功能,需要被适配
 */
public class LogFile {
    void writeFile() {
        System.out.println("将日志写到文件中");
    }
}
Adaptee:老的已有的类
public interface LogDb {
    /**
     * 测试用
     */
    void endurance();
}
Adapter:适配器
public class LogDbAndFileApapter implements LogDb {
    LogFile logFile = new LogFile();
    @Override
    public void endurance() {
        System.out.println("日志持久化到数据库");
    }
    public void writeFile() {
        logFile.writeFile();
    }
}
Client:客户端,也就是使用适配器的地方
public class Client {
    public static void main(String[] args) {
        LogDbAndFileApapter logDbAndFileApapter = new LogDbAndFileApapter();
        logDbAndFileApapter.writeFile();
        logDbAndFileApapter.endurance();
    }
}
类适配器
就是将组合改为继承以此来达到复用的目的,和对象适配器本质上是相同的,都是为了复用已有的功能.
类适配器和对象适配器的权衡
- 
从实现上:类适配器使用对象继承的方式,是静态的定义方式;而对象适配器使用对象组合的方式,是动态组合的方式
 - 
对于类适配器,由于适配器直接继承了 Adaptee,使得适配器不能和 Adapter的子类一起工作,因为继承是静态的关系,当适配器继承了 Adaptee后,就不可能再去处理 Adaptee的子类了
 - 
对于对象适配器,允许一个 Adapter和多个 Adaptee,包括 Adaptee和它所有的子类一起工作。因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓。
 - 
对于类适配器,适配器可以重定义 Adaptee的部分行为,相当于子类覆盖父类的部分实现方法
 - 
对于对象适配器,要重定义 Adaptee的行为比较困难,这种情况下,需要定义Adaptee的子类来实现重定义,然后让适配器组合子类。
 - 
对于类适配器,仅仅引入了一个对象,并不需要额外的引用来间接得到 Adaptee
 - 
对于对象适配器,需要额外的引用来间接得到 Adaptee
 - 
在Java开发中,建议大家尽量使用对象适配器的实现方式。当然,具体问题具体分析,根据需要来选用实现方式,最合适的才是最好的。
 
适配器模式优缺点
适配器模式有如下优点。
- 更好的复用性如果功能是已经有了的,只是接口不兼容,那么通过适配器模式就可以让这些功能得到
 - 更好的复用
 - 更好的可扩展性在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
 
适配器模式有如下缺点。
- 
过多地使用适配器,会让系统非常零乱,不容易整体进行把握
比如,明明看到调用的是A接口,其实内部被适配成了B接口来实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
 
本文来自博客园,作者:小鸡小鸡快点跑,转载请注明原文链接:https://www.cnblogs.com/clion/p/14171695.html
                    
                
                
            
        
浙公网安备 33010602011771号