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

    适配器模式:将一个本不能兼容客户端的类的接口通过适配器转为可以兼容的接口。

      这里有一个“中国学生接口”,定义了“说中国话”和“听中国话两个方法”

    //中国学生接口
    public interface ChineseStudent {
        void speakChinese();
    
        void listenChinese();
    }
    
    //中国学生类
    public class ChineseStudent1 implements ChineseStudent {
    
        public String name;
    
        public ChineseStudent1(String name){
            this.name = name;
        }
    
        @Override
        public void speakChinese() {
            System.out.println("学生:" + name + "说话");
        }
    
        @Override
        public void listenChinese() {
            System.out.println("学生:" + name + "聆听");
        }
    }
    
    //测试方法
    public class Test {
        public static void main(String[] args) {
            ChineseStudent chineseStudent = new ChineseStudent1("zhangsan");
            chineseStudent.speakChinese();
            chineseStudent.listenChinese();
        }
    }

    测试结果:

    学生:zhangsan说话
    学生:zhangsan聆听

      此时如果来了一个外国学生呢,这个外国学生不会说中文并且也听不懂中文,那么他如何去和其他中国学生交流呢,此时我们就需要一个“翻译”——适配器

    //外国学生类
    public class ForeignStudent {
    
        private String name;
    
        public ForeignStudent(String name){
            this.name = name;
        }
    
        public void speakEnglish(){
            System.out.println("学生:" + name + "说话");
        }
    
        public void listenEnglish() {
            System.out.println("学生:" + name + "聆听");
        }
    
    }
    //适配器类
    public class Translator implements ChineseStudent{
    
        //实例外国学生类
        ForeignStudent foreignStudent = new ForeignStudent("Joe");
    @Override
    public void speakChinese() { foreignStudent.speakEnglish(); } @Override public void listenChinese() { foreignStudent.listenEnglish(); } }
    //测试方法
    public class Test {
        public static void main(String[] args) {
            ChineseStudent chineseStudent = new ChineseStudent1("zhangsan");
            chineseStudent.speakChinese();
            chineseStudent.listenChinese();
    
            ChineseStudent foreignStudent = new Translator();
            foreignStudent.speakChinese();
            foreignStudent.listenChinese();
        }
    }

    测试结果:

    学生:zhangsan说话
    学生:zhangsan聆听
    学生:Joe说话
    学生:Joe聆听

    这样的话即使外国学生类不能直接实现“说中文”和“听中文”方法,但是通过适配器就完成了这一操作,便兼容了ChineseStudent接口。

    总结:虽然适配器模式可以去兼容接口,但是这种操作通常是维护时不希望去改变兼容方与被兼容方的类时才被考虑的方法,如果在开发时能考虑到接口不兼容的问题,及时解决,通常问题就不会扩大到去兼容接口的程度。

  • 相关阅读:
    指针和引用作为函数参数传递
    cv::Mat.type()
    Matlab 双目标定工具箱
    invalid conversion from `const void*' to `void*'
    error: 'vector' is not a member of cv
    单例模式与静态成员
    RGBD SLAM V2 +Ubuntu 16.04+ROS KINETIC配置及运行
    EntityFrameworkCore + MySQL 主从复制应用读写分离
    Docker 搭建 MySQL8.0 主从复制环境
    Asp.Net Core 项目中使用 Serilog 输出日志到 Elasticsearch
  • 原文地址:https://www.cnblogs.com/yimengyizhen/p/11146216.html
Copyright © 2011-2022 走看看