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

    定义

    适配器模式(adapter),他的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作,属于结构型设计模式。

    类适配器

    在我国,居民用电是220V交流电,手机锂电池使用5V直流电,我们这时候就需要电源适配器来进行转换,代码如下:

    //220v交流电
    public class AC220 {
    
        public int outputAC220V(){
            System.out.println("输出220v交流电");
            return 220;
        }
    }
    
    //5V直流电
    public interface DC5 {
        int output5V();
    }
    
    //电源适配器
    public class PowerAdapter extends AC220 implements DC5{
        @Override
        public int output5V() {
            int ac220V = outputAC220V();
            int dc5 = ac220V/44;
            System.out.println("PowerAdapter : ac220V====>dc"+dc5+"V");
            return dc5;
        }
    }
    

    测试:

        public static void main(String[] args) {
            PowerAdapter powerAdapter = new PowerAdapter();
            powerAdapter.output5V();
        }
    

    image-20201227195622201

    uml类图

    image-20201227195649882

    对象适配器

    对象适配器通过组合来实现适配器功能。针对与第一种,只需要修改Adapter

    //电源适配器
    public class PowerAdapter implements DC5 {
    
        private AC220 ac220;
    
        PowerAdapter(AC220 ac220) {
            if(Objects.isNull(ac220))
                throw new RuntimeException("AC220 null!!!");
            this.ac220 = ac220;
        }
    
        @Override
        public int output5V() {
            int ac220V = ac220.outputAC220V();
            int dc5 = ac220V/44;
            System.out.println("PowerAdapter : ac220V====>dc"+dc5+"V");
            return dc5;
        }
    }
    

    image-20201227200210286

    接口适配器

    当适配器接口众多时候,如果直接实现接口,会出现很多方法,过于臃肿,我们可以使用抽象类实现接口,空实现接口的各种方法,然后让子类实现个别适配方法。

    //220v交流电
    public class AC220 {
    
        public int outputAC220V(){
            System.out.println("输出220v交流电");
            return 220;
        }
    }
    //直流电
    public interface DC {
        int output5V();
        int output10V();
        int output20V();
    }
    
    //电源适配器抽象实现
    public abstract class PowerAdapter implements DC {
    
        protected AC220 ac220;
    
        PowerAdapter(AC220 ac220) {
            if(Objects.isNull(ac220))
                throw new RuntimeException("AC220 null!!!");
            this.ac220 = ac220;
        }
    
        @Override
        public int output5V() {
            return 0;
        }
    
        @Override
        public int output10V() {
            return 0;
        }
    
        @Override
        public int output20V() {
            return 0;
        }
    }
    //5V电源适配器(10V和20V省略)
    public class Power5VAdapter extends PowerAdapter{
        Power5VAdapter(AC220 ac220) {
            super(ac220);
        }
    
        @Override
        public int output5V() {
            int ac220V = super.ac220.outputAC220V();
            int dc5 = ac220V/44;
            System.out.println("PowerAdapter : ac220V====>dc"+dc5+"V");
            return 0;
        }
    }
    

    测试:

            PowerAdapter powerAdapter = new Power5VAdapter(new AC220());
            powerAdapter.output5V();
    

    类图:

    image-20201227201741319

  • 相关阅读:
    JS设计模式——工厂模式详解
    JS 使用const声明常量的本质(很多人都有误解)
    模拟ES6中的Promise实现,让原理一目了然
    JS设计模式——观察者模式(通俗易懂)
    JS设计模式——单例模式剖析
    C#播放文字内容
    通过自定义扩展方法DistinctBy实现去重
    C#缓存HttpRuntime.Cache
    Oracle中dblink的使用
    Oracle查询最近执行的sql脚本
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14198474.html
Copyright © 2011-2022 走看看