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

    1. 适配器模式简介               

                              

    适配器模式的结构:
      目标(Target)角色:这就是所期待得到的接口,由于这里讨论的是类适配器模式,因此目标不可以是类。
      源(Adaptee)角色:被适配的接口(可以是接口或者类)。
      适配器(Adapter)角色:适配器类是本模式的核心,适配器把源接口转换成目标接口,显然这一角色不可以是接口,而必须是具体类。
    适配器模式有 类的适配器模式 对象的适配器模式 两种不同的形式.

                               

    2. 适配器模式的实现

    以插头和插座来说明适配器模式的用途:
      笔记本电脑的插头一般都是三相的,即除了阳极、阴极外,还有一个地极。而有些地方的电源插座却只有两极,没有地极。电源插座与笔记本电脑的电源插头不匹配使得笔记本
    电脑无法使用,这时候一个三相到两相的转换器(适配器)就能解决此问题,而这正像是本模式所做的事情。

    2.1 使用组合的方式实现插座适配器(对象适配器)

    笔记本的插头是三相的,所以应该使用三相插座来供电

    public interface ThreePlugIf {      //三相插座接口
    
        //使用三相电流供电
        public void powerWithThree();
    }

    但目前没有三相插座,只有二相插座(GB)

    public class GBTwoPlug {
        
    //供电方法 public void powerWithTwo(){ System.out.println("使用二相电流供电"); } }

    所以作为一个使用三相插头供电的笔记本,想要用电就需要将二相插座转换为三相,适配器就出现了

    public class NoteBook {
    
        private ThreePlugIf plug; //创建一个三相插座的成员变量
        
        public NoteBook(ThreePlugIf plug){  //笔记本的构造方法
            this.plug = plug;
        }
        //使用插座充电(笔记本是使用三相插头的)
        public void charge(){
            plug.powerWithThree();
        }
        
    
        public static void main(String[] args) {
            //只有二相的国标插座,没有三相的,这时需要一个将二相插座转换为三相的适配器
            GBTwoPlug two=new GBTwoPlug();
            ThreePlugIf three=new TwoPlugAdapter(two); //二相转三相
             
            NoteBook nb=new NoteBook(three);
            nb.charge(); //供电
        } 
    }

    二相转三相的插座适配器

    public class TwoPlugAdapter implements ThreePlugIf {
    
        private GBTwoPlug gBTwoPlug;    //二相插座
        public TwoPlugAdapter(GBTwoPlug gBTwoPlug){
            this.gBTwoPlug = gBTwoPlug;
        }
        
        @Override
        public void powerWithThree() {
             System.out.println("通过转化");
             gBTwoPlug.powerWithTwo();
              
        }
    }

    运行笔记本的main方法可得

    对以上过程的分析:

                                 

    2.2  采用继承的方式实现插座适配器(类适配器)

    接上面,要采用继承方式实现插座适配器,需要继承二相,同时实现三相

    public class TwoPlugAdapterExtends extends GBTwoPlug implements ThreePlugIf {
    
        @Override
        public void powerWithThree() {
            System.out.println("通过继承适配器");
               this.powerWithTwo();
        }
    
    }

    笔记本main方法如下

    public class NoteBook {
    
        private ThreePlugIf plug; //创建一个三相插座的成员变量
        
        public NoteBook(ThreePlugIf plug){  //笔记本的构造方法
            this.plug = plug;
        }
        
        //使用插座充电(笔记本是使用三相插头的)
        public void charge(){
            plug.powerWithThree();
        }
        
        public static void main(String[] args) {
            
    //只有二相的国标插座,没有三相的,这时需要一个将二相插座转换为三相的适配器 ThreePlugIf three = new TwoPlugAdapterExtends(); NoteBook nb = new NoteBook(three); nb.charge(); } }

    输出

    2.3 两种方法特点:

                           

    3. 适配器的作用

            

  • 相关阅读:
    springmvc跨域+token验证(app后台框架搭建二)
    JSON Web Tokens(JWT)
    spring4+springmvc+mybatis基本框架(app后台框架搭建一)
    [原创] zabbix学习之旅一:源码安装
    ROC 曲线和 AUC 值
    win7 64位系统 Oracle32bit + PL/SQL访问Orale服务,Oracle 11g的安装,中文乱码问题的解决
    CentOS系统安装配置mysql
    Loaded plugins: fastestmirror, refresh-packagekit, security
    求LCA最近公共祖先的离线Tarjan算法_C++
    求LCA最近公共祖先的在线ST算法_C++
  • 原文地址:https://www.cnblogs.com/zjfjava/p/7266428.html
Copyright © 2011-2022 走看看