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

  • 相关阅读:
    Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C 倒序并查集
    hdu 5573 Binary Tree 构造
    hdu 5514 Frogs 容斥思想+gcd 银牌题
    hdu 5536 Chip Factory 字典树+bitset 铜牌题
    LA 7263 Today Is a Rainy Day bfs+暴力 银牌题
    hdu 5834 Magic boy Bi Luo with his excited tree 树形dp+转移
    hdu 5869 Different GCD Subarray Query BIT+GCD 2016ICPC 大连网络赛
    LA 7043 International Collegiate Routing Contest 路由表 字典树离散化+bitset 银牌题
    校验注解工具类
    java-创建对象实例
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14198474.html
Copyright © 2011-2022 走看看