首页 > 编程语言 >06.(结构型模式)java设计模式之适配器模式

06.(结构型模式)java设计模式之适配器模式

时间:2023-01-08 14:22:13浏览次数:45  
标签:适配器 System 模式 public println Override 设计模式 void

一、什么是适配器模式(Adapter Pattern)

作为两个不兼容的接口之间的桥梁,适配器模式使得原本由于接口不兼容而不能一起工作的两个类可以一起工作。

适配器模式包括3种形式:

  • 类适配器模式

                 想将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。

  • 对象适配器模式

                  想将一个对象转换成满足另一个新接口的对象时,可以创建一个适配器类,持有原类的一个实例,在适配器类的方法中,调用实例的方法就行。

  • 接口适配器模式(或又称作缺省适配器模式)

          不想实现一个接口中所有的方法时,可以创建一个Adapter,实现所有方法,在写别的类的时候,继承Adapter类即。

二、适配器的实现方式

模式结构(角色)分析:

  • 源(Adaptee):需要被适配的对象或类型,相当于插头。
  • 适配器(Adapter):连接目标和源的中间对象,相当于插头转换器。
  • 目标(Target):期待得到的目标,相当于插座。

2.1类适配器模式

类关系图:

   

统一模型:

代码实现:

类的适配器
/*
*源类
* */
public class OrgAdaptee {
    public void methodA(){
        System.out.println("OrgAdaptee->methodA");
    }
}
/*
* 目标模型
* */
public interface TargetModule {
    void methodA();
    void methodB();
    void methodC();
}
/*
* 新老模型的适配器操作
* */
public class Adapter extends OrgAdaptee implements TargetModule {

    @Override
    public void methodB() {
        System.out.println("TargetModule->methodB");
    }

    @Override
    public void methodC() {
        System.out.println("TargetModule->methodC");
    }
}

测试用例:

/*
 * 类的适配器模式
 * */
@Test
public void getClsAdapter() {
    Adapter adapter = new Adapter();
    adapter.methodA();
    adapter.methodB();
    adapter.methodC();
}

测试结果:

OrgAdaptee->methodA
TargetModule->methodB
TargetModule->methodC

2.2对象适配器模式

类关系图:

统一模型:

代码实现:

对象适配器
 /*
*源类
* */
public class OrgAdaptee {
    public void methodA(){
        System.out.println("OrgAdaptee->methodA");
    }
}
/*
* 目标模型
* */
public interface TargetModule {
    void methodA();
    void methodB();
    void methodC();
}
/*
* 新老模型的适配器操作 (对象的适配器)
* */
public class ObjectAdapter implements TargetModule {
    /*
    *源头
    * */
    OrgAdaptee orgAdaptee;
    /*
    * 构造函数
    * */
    public ObjectAdapter(OrgAdaptee orgAdaptee){
        this.orgAdaptee=orgAdaptee;
    }
    @Override
    public void methodA() {
        orgAdaptee.methodA();
    }

    @Override
    public void methodB() {
        System.out.println("ObjectAdapter->methodB");
    }

    @Override
    public void methodC() {
        System.out.println("ObjectAdapter->methodC");
    }
}

测试用例:

/*
* 对象适配器
* */
 @Test
 public void getObjAdapter() {
     OrgAdaptee orgAdaptee = new OrgAdaptee();
     ObjectAdapter adapter = new ObjectAdapter(orgAdaptee);
     adapter.methodA();
     adapter.methodB();
     adapter.methodC();
 }

测试结果:

OrgAdaptee->methodA
ObjectAdapter->methodB
ObjectAdapter->methodC

2.3接口适配器模式(缺省适配模式)

类关系图:

统一模型:

代码实现:

接口适配器
 /*
*  支付的统一接口(源(Adapee)角色)接口适配器
* */
public interface PayGateWay {
    void unifiedOrder();
    void refund();
    void query();
    void sendRedPack();
}
/*
* 适配器  所有方法为空实现的操作
* */
public class PayGateWayAdapter implements  PayGateWay{
    @Override
    public void unifiedOrder() {
    }

    @Override
    public void refund() {

    }

    @Override
    public void query() {

    }

    @Override
    public void sendRedPack() {

    }
}
/*
* 目标(Target)角色
* */
public class ProductVideoOrder extends PayGateWayAdapter {

    @Override
    public void unifiedOrder() {
        System.out.println("ProductVideoOrder->unifiedOrder");
    }

    @Override
    public void refund() {
        System.out.println("ProductVideoOrder->refund");
    }
}

/*
* 目标(Target)角色
* */
public class ProductVipOrder extends PayGateWayAdapter {
    @Override
    public void unifiedOrder() {
        System.out.println("ProductVipOrder->unifiedOrder");
    }

    @Override
    public void refund() {
        System.out.println("ProductVipOrder->refund");
    }

    @Override
    public void sendRedPack() {
        System.out.println("ProductVipOrder->sendRedPack");
    }
}

测试用例:

/*
* 接口适配器
* */
    @Test
    public void getApiAdapter() {
        ProductVideoOrder productVideoOrder = new ProductVideoOrder();
        productVideoOrder.refund();
        productVideoOrder.unifiedOrder();
        productVideoOrder.query();
        productVideoOrder.sendRedPack();
    }

测试结果:

ProductVideoOrder->refund
ProductVideoOrder->unifiedOrder

方法评估:

  • 在使用一些旧系统或者是类库时,经常会出现接口不兼容的问题,适配器模式在解决这类问题具有优势。
  • 学习设计模式一定不要局限代码层面,要从软件系统整体去考虑,而不是为了使用设计模式,而去使用设计模式。

优点:

  • 可以让任何两个没有关联的类一起运行,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
  • 增加灵活度,提高复用性,适配器类可以在多个系统使用,符合开闭原则。

缺点:

  • 整体类的调用链路增加,本来A可以直接调用C,使用适配器后是A调用B,B再调用C。

 

 

 

标签:适配器,System,模式,public,println,Override,设计模式,void
From: https://www.cnblogs.com/q994321263/p/16961848.html

相关文章

  • 3108 9361 9460等卡在浪潮两路机器UEFI模式下配置步骤
    1.RAID卡信息查看以及相关设置1.1开机进入到BIOS的RAID界面开机在浪潮LOGO处按”Delete”键进入到BIOS操作界面,选择”Advanced”选项,如下图:  择”AVAGOMegaRAID......
  • 浅谈PHP设计模式的状态模式
    简介:状态模式,属于行为型的设计模式。当一个对象的内在状态发生改变时,允许改变其行为,这个对象看起来像是改变了其类。适用场景:控制一个对象的状态改变过于复杂时,把状态......
  • 设计模式之美
    设计模式1.为什么要学习设计模式:应对面试中的设计模式相关问题;告别写呗别人吐槽的烂代码;提高复杂代码的设计和开发能力;让读源码、学框架事半功倍;为你的职场发展做......
  • 设计模式-状态变化-State、Memento
    状态模式上述代码缺点:如果增加一个Stat,要加很多ifelse改进方法Memento备忘录模式如果快照多了比如50次redo/需要用到一些复杂的技术,比如序列化......
  • 设计模式学习笔记
    静态工厂工厂方法可以隐藏创建产品的细节,且不一定每次都会真正创建产品,完全可以返回缓存的产品,从而提升速度并减少内存消耗。里氏替换原则返回实现接口的任意子类都可以......
  • 【Redis技术探索】「数据迁移实战」手把手教你如何实现在线+离线模式进行迁移Redis数
    从实战出发使用RedisShake进行Redis数据在线+离线模式迁移指南RedisShake基本介绍​​RedisShake​​是基于​​redis-port​​基础上进行改进的是一款开源的Redis迁移工具,......
  • 【Redis技术探索】「数据迁移实战」手把手教你如何实现在线+离线模式进行迁移Redis数
    从实战出发使用RedisShake进行Redis数据在线+离线模式迁移指南RedisShake基本介绍RedisShake是基于redis-port基础上进行改进的是一款开源的Redis迁移工具,支持Cluster......
  • mysql 半同步的模式 after_commit 与 after_sync
    参考MySQL半同步after_sync与after_commit-墨天轮(modb.pro)1.after_commit提交流程:client-->executesql-->wrtieredolog-->writebinlog-->innodbstoragecommi......
  • LVS负载均衡DR模式
    第六章LVS负载均衡DR模式​实验图​推荐步骤​网站服务器LVS服务器存储和客户端配置ip地址​在centos04配置NFS共享存储两台web服务器连接到共享存储服务器​在centos01配置......
  • 35_Java中的设计模式简单了解
    Java中的设计模式注意:只是简单了解设计模式(Designpattern)​ 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用......