zoukankan      html  css  js  c++  java
  • 结构型之适配器模式

    序言

    适配器模式有3种类型,分别是类的适配器模式,对象的适配器模式,缺省的适配器模式,下面分别介绍。

    适配器模式的几种角色:

    • 源角色:类,需要适配的对象
    • 目标角色:接口或抽象类,包括了需要适配的原有接口和新接口
    • 适配器角色:类,通过继承或者委托的方式,实现新旧接口的转化

    1. 类的适配器模式

    类的适配器结构如下图:

    ![](http://images2017.cnblogs.com/blog/946528/201708/946528-20170816233958271-1134021214.png)
    > 套路: > 1. 将新旧方法统一到接口中 > 2. 创建适配器类,继承旧类,实现接口
    /**
     * 原有插座,只提供两孔插座
     */
    public class Socket {
        public void provideTwoHoles(){
            System.out.println("提供两孔插座");
        }
    }
    
    /**
     * 插座接口,有2孔,也有3孔
     */
    public interface SocketInterface {
        public void provideTwoHoles();
        public void provideThreeHoles();
    }
    
    /**
     * 插座适配器,提供3孔插座和2孔插座
     */
    public class SocketAdapter extends Socket implements SocketInterface{
    
        //原有插座没有该方法
        public void provideThreeHoles() {
    
            //3孔插座相关代码
            //可调用原有插座方法super.provideTwoHoles();
            System.out.println("提供3孔插座");
        }
    }
    
    /**
     * 测试对象适配器,提供3孔插座
     */
    public class AdapterObjectTest {
        @Test
        public void testAdapterObject(){
            SocketAdapter socketAdapter = new SocketAdapter(new Socket());
            socketAdapter.provideThreeHoles();
        }
    }
    

    吹牛:
      好处:适配器类通过继承的方式来完成新旧的转化,而且还可以重写原类中的方法
      坏处:只能适配源类,不能适配其子类,当有这样的需求时,每次都要写一个适配器类,比较麻烦

    2. 对象的适配器模式

    对象的适配器结构如下图:

    ![](http://images2017.cnblogs.com/blog/946528/201708/946528-20170816234023725-1417291107.png)

    套路:
    1. 将新旧方法统一到接口中
    2. 创建适配器类,实现接口,采用委托的形式完成新旧转化

    /**
     * 原有插座,只提供两孔插座
     */
    public class Socket {
        public void provideTwoHoles(){
            System.out.println("提供两孔插座");
        }
    }
    
    /**
     * 插座接口,有2孔,也有3孔
     */
    public interface SocketInterface {
        public void provideTwoHoles();
        public void provideThreeHoles();
    }
    
    /**
     * 插座适配器,提供3孔插座和2孔插座
     */
    public class SocketAdapter implements SocketInterface {
    
        private Socket socket;
    
        //通过构造方法,初始化原对象
        public SocketAdapter(Socket socket){
            this.socket = socket;
        }
    
        //直接复用原对象方法
        public void provideTwoHoles() {
            socket.provideTwoHoles();
        }
    
        //提供新接口,3孔插口
        public void provideThreeHoles() {
    
            //3孔插座相关代码
            //可调用原有插座方法super.provideTwoHoles();
            System.out.println("提供3孔插座");
        }
    }
    

    吹牛: 适配器类可以适配多个原类及其子类,比较灵活,较为常用

    3. 缺省的适配器模式

    具体类实现接口时,具体类会实现接口里所有的方法,可是有时并不需要实现里面所有的方法,这时,缺省的适配器模式就派上用场了,做法是在具体类和接口中间横插一杠子,建一个抽象类,实现接口,但方法体都是空的,让具体类继承抽象类,即可解决该问题。

    后记

  • 相关阅读:
    IDirect3DDevice9::Clear
    Width vs Pitch
    5- vue django restful framework 打造生鲜超市 -完成商品列表页(上)
    4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍
    3- vue django restful framework 打造生鲜超市
    2- vue django restful framework 打造生鲜超市 -环境搭建
    1- vue django restful framework 打造生鲜超市
    Scrapy分布式爬虫打造搜索引擎- (二)伯乐在线爬取所有文章
    windows10上安装mysql
    博客开通第一天
  • 原文地址:https://www.cnblogs.com/codebug/p/7376662.html
Copyright © 2011-2022 走看看