zoukankan      html  css  js  c++  java
  • 模式的秘密-适配器模式

    适配器模式:

    定义:适配器模式将类的接口,转换成客户期望的另一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

    把“被适配者”作为一个对象组合到适配器类中,以修改目标接口包装被适配者

    • target:目标接口。   // 下面的三相插头
    • Adapter:适配器。                        //下面的二相适配器
    • adaptee:被适配类。                         //下面的二相插座

    实例:

    假如现在一台笔记本的插头是三相的,而插座是二相的,为了能给笔记本充电,需要拿一个适配器,这样就能用二相的插座给三相的笔记本充电。

    分析:

    • 首先有一个二相插座:GBTowPlug。
    • 还有一个三相插头:ThreePlugIf。
    • 二相插座和三相插头接口之间需要一个适配器:TwoPlugAdapter。
    • 还有一个用三相插头接口充电的笔记本。
    1. 因为三相插头可能插到不同的适配器上去插入不同的插座上,这是多态体现,因此三相插头就设计成一个接口类,适配器继承这个接口,不同的适配器都能继承这个接口
    2. 对于适配器和二相插座来说,一种适配器对应适配一种插座,适配器使用插座。因此这里可以设计成把插座类作为一个变量传入适配器类里面,供适配器去使用
    3. 笔记本要使用适配器,因此可以把适配器传入给笔记本内部,供笔记本类调用

    代码编写:

    第一步:声明一个三相插头接口:

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

    第二步:定义一个二相插头。

    package com.Adapter;
    
    public class GBTowPlug {
    
        //使用二相电流供电
        public void powerWithTwo()
        {
            System.out.println("使用二相电流供电");
        }
    }

    第三步:对于这个三相插头接口,用一个二相插头适配器去实现(继承),但是适配器需要使用二相插头(通过构造方法传入作为变量):

    package com.Adapter;
    /*
     * 二相转三相的插座的插座适配器
     * */
    public class TwoPlugAdapter implements ThreePlugIf {
    
        private GBTowPlug plug;
        
        public TwoPlugAdapter(GBTowPlug plug) 
        {    
            this.plug=plug;
        }
        @Override
        public void powerWithThree() {
            
            System.out.println("通过转化");
            plug.powerWithTwo();//适配器调用二相插座通电
        }
    }

    第四步:定义一个笔记本电脑类:笔记本电脑需要通过适配器去连上二相插座(适配器通过构造方法传入笔记本类),通电。

    package com.Adapter;
    
    public class NoteBook {
        
        private ThreePlugIf plug;
        
        public NoteBook(ThreePlugIf plug)
        {
            this.plug=plug;
        }
        //使用插座充电
        public void charge()
        {
            plug.powerWithThree();
        }
        
        public static void main(String[] args) {
            
            GBTowPlug two=new GBTowPlug();//二相插座
            ThreePlugIf three=new TwoPlugAdapter(two);//二相插座适配器
            NoteBook nb=new NoteBook(three);//笔记本
            nb.charge();
        }
    
    }

    效果:

    通过转化
    使用二相电流供电

    适配器分类:

    1,组合

    采用组合的方式的适配器称为对象适配器

    特定:把“被适配者”作为一个对象组合到适配器类中,以修改目标接口包装被适配者。

    2,继承

    采用继承方式的称为类适配器。

    特定:通过多重继承不兼容接口,实现对目标接口的匹配,单一的为某个类而实现适配。

    通过继承的代码:

    加上一个类:

    package com.Adapter;
    //采用继承方式的插座适配器
    public class TwoPlugAdapterExtends extends GBTowPlug implements ThreePlugIf 
    {
        @Override
        public void powerWithThree() {
            System.out.println("借助继承适配器");
            this.powerWithTwo();//调用自己所继承的powerWithTwo方法
        }
    }

    调用:

    package com.Adapter;
    
    public class NoteBook {
        
        private ThreePlugIf plug;
        
        public NoteBook(ThreePlugIf plug)
        {
            this.plug=plug;
        }
        //使用插座充电
        public void charge()
        {
            plug.powerWithThree();
        }
        
        public static void main(String[] args) {
            
            GBTowPlug two=new GBTowPlug();
            ThreePlugIf three=new TwoPlugAdapter(two);
            NoteBook nb=new NoteBook(three);
            nb.charge();
            
            three=new TwoPlugAdapterExtends();
            nb=new NoteBook(three);
            nb.charge();
        }
    
    }

    输出:

    通过转化
    使用二相电流供电
    借助继承适配器
    使用二相电流供电

    适配模式作用:

    1,透明

    通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。

    2,重用

    复用了现存的类,解决了现存类和复用环境要求不一致的问他。

    3,低耦合

    将目标类和适配器类解耦,通过引入一个适配器类重用现有的适配者类,而无须修改原有代码(遵循开闭原则)。

  • 相关阅读:
    MySQL Error--存储inode用完后报设备没有空间
    MySQL Binlog--基于ROW模式的binlog event大小限制
    MySQL Transaction--网络丢包导致长时间未提交事务
    java核心技术第四篇之JDBC第二篇
    java核心技术第三篇之JDBC第一篇
    java核心技术第二篇之数据库SQL语法
    JVM垃圾回收器原理及使用介绍
    JVM中优化指南
    MySQL常用工具、日志及读写分离
    java基础第十九篇之Xml
  • 原文地址:https://www.cnblogs.com/alsf/p/8491199.html
Copyright © 2011-2022 走看看