zoukankan      html  css  js  c++  java
  • 设计模式-适配器模式

    1、定义

      适配器模式将一个类的接口,转换成客户期望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

    2、实现方式

    1)通过组合方式实现:

    /**
     * 目标接口
     */
    public interface ThreePlugIf {
        /**
         * 使用三相电流供电
         */
        void powerWithThree();
    }

    客户端

    package com.cn.shejimoshi.shipeiqimoshi;
    
    /**
     * 客户端
     */
    public class NoteBook {
    
        private ThreePlugIf threePlugIf;
    
        public NoteBook(ThreePlugIf threePlugIf) {
            this.threePlugIf = threePlugIf;
        }
    
        /**
         * 使用插座充电
         */
        public void charge(){
            threePlugIf.powerWithThree();
        }
    }

    被适配的类

    package com.cn.shejimoshi.shipeiqimoshi;
    
    /**
     *被适配类
     */
    public class GBTwoPlug {
    
        public void powerWithTwo(){
            System.out.println("使用二相电流供电");
        }
    }

    适配器

    package com.cn.shejimoshi.shipeiqimoshi;
    
    /**
     * 适配器
     */
    public class TwoPlugAdapter implements ThreePlugIf{
    
        private GBTwoPlug gbTwoPlug;
    
        public TwoPlugAdapter(GBTwoPlug gbTwoPlug) {
            this.gbTwoPlug = gbTwoPlug;
        }
    
        public void powerWithThree() {
            System.out.println("转换--通过组合方式实现适配器模式");
            gbTwoPlug.powerWithTwo();
        }
    }

      说明:适配器将GBTwoPlug 类的接口powerWithTwo,转换成客户NoteBook 期望的另外一个接口powerWithThree。使得原本不兼容的NoteBook GBTwoPlug类可以在一起工作。

    2)通过继承方式实现

    适配器修改为:

    package com.cn.shejimoshi.shipeiqimoshi;
    
    public class TwoPlugAdaterExtend extends GBTwoPlug implements ThreePlugIf {
    
        public void powerWithThree() {
            System.out.println("转换--通过继承方式实现适配器模式");
            powerWithTwo();
        }
    }

    测试方法

    public class NoteBookTest {
    
        @Test
        public void charge(){//测试组合方式
    
            GBTwoPlug gbTwoPlug=new GBTwoPlug();
            ThreePlugIf threePlugIf=new TwoPlugAdapter(gbTwoPlug);
            NoteBook noteBook=new NoteBook(threePlugIf);
            noteBook.charge();
        }
    
        @Test
        public void charge2(){//测试继承方式
            ThreePlugIf threePlugIf=new TwoPlugAdaterExtend();
            NoteBook noteBook=new NoteBook(threePlugIf);
            noteBook.charge();
        }
    }

    3、组合与继承实现方式的比较

    • 组合方式:可以基于面向接口编程适配多个被适配类,比如将适配器中的GBTwoPlug 域改成某个接口,建议使用组合方式
    • 继承方式:由于只能继承一个父类,故只能适配一个被适配类

    4、适配器的作用

    • 将目标类和适配者类解耦,通过引入一个适配器类重用现有的是配者类,而无需修改原有代码
    • 通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的

    写在最后:

     设计模式是一种经验总结、编程思想,拒绝代码的迷惑。

     一种设计模式的代码变体可以有很多,但万变不离其宗。

  • 相关阅读:
    java 设计模式之———单例模式
    java 中的 23 种开发模式(转)
    Java 简单的 socket 编程入门实战
    蓝桥杯比赛java 练习《立方变自身》
    蓝桥杯比赛关于 BFS 算法总结方法以及套路分析
    蓝桥杯比赛javaB组练习《生日蜡烛》
    C语言中调用运行python程序
    解决:执行python脚本,提示错误:/usr/bin/python^M: 解释器错误: 没有那个文件或目录。
    webRTC中回声消除(AEC)模块编译时aec_rdft.c文件报错:
    VMware下Linux虚拟机访问本地Win共享文件夹
  • 原文地址:https://www.cnblogs.com/shixiemayi/p/9613651.html
Copyright © 2011-2022 走看看