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

    定义:

    将一个类的接口,转成客户期望的另一接口。适配器让原本接口不兼容的类可以合作无间。

    作用:

    解耦,用户调用时只调用匹配的接口,尽管调用的是另一接口提供的方法,但其中封装的信息及细节已在适配器中实现,实现了用户与适配器另一端接口的解耦。
    如果我们想要改变接口,适配器可以将改变的部分封装起来,用户则不需要随着目标接口的更改而更改。

    适用场景:

    1 系统需要使用现有的类,但是现有的却不兼容
    2 需要建立一个可以重复使用的类,易于扩展,用于彼此关系不大的类之间的解耦
    3 需要一个统一的输出接口,输出类型不了预知

    过程如图:

    此图为适配器解析的过程,其中的客户和被适配器是解耦的,相互依靠适配器进行请求和返回,彼此并不知道各自的存在。

    如下为适配器的类图

    类适配器

    类适配器模式下,适配器继承了被适配器和目标类,这种情况实现了多继承,而java不支持多继承,所以其他编程语言可以考虑这种情况。

    对象适配器

    使用对象适配器,使用组合的方式,用修改的接口包装被适配者:这样使得被适配器子类均可以搭配该适配器来使用。

    以下为实现适配器的简单demo,利于理解

    定义一个目标类,具体为一个客户获取食物:

    
        public class Customer {
    
        private Map<String,String> customerFood;
    
        public Map<String, String> getCustomerFood() {
            return customerFood;
        }
    
        public void setCustomerFood(Map<String, String> customerFood) {
            this.customerFood = customerFood;
        }
    }
    

    当客户有一天想换一种方式吃东西,则定义一种接口,为客户想要的方式:

    
    public interface CustomerInterface {
    
        public String getFish();
    
        public String getMeat();
    
    }
    
    

    那么接下来,需要提供一种适配方法,从一种接口转为另一种,此适配器继承了目标接口,而java不支持多继承,不利于扩展,不推荐使用

    public class CustomerAdapt extends Customer implements CustomerInterface {
    
    
        @Override
        public String getFish() {
            return (String)super.getCustomerFood().get("fish");
        }
    
        @Override
        public String getMeat() {
            return (String)super.getCustomerFood().get("meat");
        }
    }
    
    

    如代码所示,CustomerAdapt 实现CustomerInterface 接口,继承Customer 类经过CustomerInterface接口实现,嵌套Customer getCustomerFood()获得了所需的食物。
    我们的角色划分为:

    CustomerInterface :目标角色——目标接口,系统所期待实现的目标;

    Customer :源角色——当前已经存在的原有的实现类,即将被适配的类;

    CustomerAdapt :适配器角色——将原有实现装换为目标接口的实现。

    如下图代码,为对象关系的适配器,此类型适配器,更容易搭配

    public class CustomerAdaptTest implements CustomerInterface {
    
        private Customer customer;
    
        private CustomerAdaptTest(){}
    
        public CustomerAdaptTest(Customer customer) {
           this.customer=customer;
        }
    
        @Override
        public String getFish() {
            return customer.getCustomerFood().get("fish");
        }
    
        @Override
        public String getMeat() {
            return customer.getCustomerFood().get("meat");
        }
    }
    
    
  • 相关阅读:
    数据抓去之初次接触
    PHP学习
    git预览项目
    正在加载中动画链接 css左右、关闭按钮
    正则表达式
    【独家】K8S漏洞报告|近期bug fix解读&1.11主要bug fix汇总
    关于k8s这项大动作,预示着边缘计算迎来“开源”发展的新周期……
    idou老师教你学istio :基于角色的访问控制
    K8s爆严重安全漏洞?有何应对措施与建议
    【容器魔方解读】AWS Re:Invent 2018大会
  • 原文地址:https://www.cnblogs.com/gloria-liu/p/10099186.html
Copyright © 2011-2022 走看看