• java设计模式(八)——适配器模式


    1、基本概念

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

    如我们常见的充电器,变压器

    2、类图和角色

    角色:

    目标角色:接口,如5v或9v的手机

    源角色:需要转换的,如220v的电压

    适配器:将源角色转换目标角色的实例,如5v/9v的充电器

    3、适配器类型

    适配器有三种形式:类适配器,对象适配器,接口适配器

    3.1、类适配器

    类图:

     适配器继承AC220V类,实现DC5V接口

    接口:DC5V

    public interface DC5V {
    
        int output5v();
    }

    源角色:AC220V类

    public class AC220V {
    
        public int output220v(){
            System.out.printf("输出电压:%dv
    ",220);
            return 220;
        }
    }

    适配器:

    public class Adapter extends AC220V implements DC5V {
    
        @Override
        public int output5v() {
            int output220v = super.output220v();
            int output5v = output220v / 44;
            System.out.printf("转换:%dv电压 ——》 %d v电压 
    ",output220v,output5v);
            return output5v;
        }
    }

    测试:

    public class Test {
        public static void main(String[] args) {
            Adapter adapter = new Adapter();
            int output5v = adapter.output5v();
            System.out.printf("输入电压:%dv",output5v);
        }
    }

    输出:

    输出电压:220v
    转换:220v电压 ——》 5 v电压 
    输入电压:5v

    3.2、对象适配器

    和类适配器的区别是,对象适配器采用的是组合方式代替继承方式

    那么这里的适配器就是这样写:

    public class Adapter  implements DC5V {
        private AC220V ac220V;
    
        public Adapter(AC220V ac220V){
            this.ac220V = ac220V;
        }
    
        @Override
        public int output5v() {
            int output220v = ac220V.output220v();
            int output5v = output220v / 44;
            System.out.printf("转换:%dv电压 ——》 %d v电压 
    ",output220v,output5v);
            return output5v;
        }
    }

    3.3、接口适配器:

    假如目标对象是5v,12v,24v,36v,48v等,那我们的各种适配器就需要空实现很多方法,

    例如:

    接口:

    public interface DC {
    
        int output5v();
    
        int output12v();
    
        int output24v();
    
        int output48v();
    }

    48v适配器:

    public  class A48vAdapter implements DC {
    
    
        @Override
        public int output5v() {
            return 0;
        }
    
        @Override
        public int output12v() {
            return 0;
        }
    
        @Override
        public int output24v() {
            return 0;
        }
    
        @Override
        public int output48v() {
            return 0;
        }
    }

    每个适配器会有很多空方法,所以加上一个抽象的适配器

    public abstract class AbstractAdapter implements DC {
    
        public AC220V ac220V;
    
        public AbstractAdapter(AC220V ac220V){
            this.ac220V = ac220V;
        }
    
        @Override
        public int output5v() {
    
            return 0;
        }
    
        @Override
        public int output12v() {
            return 0;
        }
    
        @Override
        public int output24v() {
            return 0;
        }
    
        @Override
        public int output48v() {
            return 0;
        }
    }

    让其他适配器继承抽象适配器

    public class A5vAdapter extends AbstractAdapter {
    
        public A5vAdapter(AC220V ac220V) {
            super(ac220V);
        }
    
        @Override
        public int output5v() {
            int output220v =super.ac220V.output220v();
            int output5v = output220v / 44;
            System.out.printf("转换:%dv电压 ——》 %d v电压 
    ",output220v,output5v);
            return output5v;
        }
    
    }
    public  class A24vAdapter extends AbstractAdapter {
    
        public A24vAdapter(AC220V ac220V) {
            super(ac220V);
        }
    
        @Override
        public int output24v() {
            int output220v =super.ac220V.output220v();
            int output24v =  24;
            System.out.printf("转换:%dv电压 ——》 %d v电压 
    ",output220v,output24v);
            return output24v;
        }
    
    }

    4、优缺点

    优点:提高代码的扩展性,符合开闭原则。

  • 相关阅读:
    AcWing 3772. 更新线路(BFS)
    AcWing 3760. 最大剩余油量(树的最长路径)
    AcWing 3771. 选取石子
    洛谷P2014—选课(树形DP)
    吴恩达机器学习ex1
    洛谷P1122—最大子树和(树形DP)
    论文中关于要使用600线的python代码
    mysql 笛卡尔积
    mysql 外键
    写参考文献有感
  • 原文地址:https://www.cnblogs.com/tdyang/p/13267815.html
Copyright © 2020-2023  润新知