设计模式之适配器模式

目录

适配器模式特点及使用场景

实际业务场景举例

代码实现

适配器模式与策略模式的区别


 

适配器模式特点及使用场景

适配器模式(Adapter)的定义如下:

        将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

适配器模式有三个角色:

target:目标角色,即当前业务场景所期望得到的接口

Adaptee:适配者角色,即需要去适配目标角色的接口

Adapter:适配器角色,相当于是一个转换器,将适配者接口转换成目标接口的类型

例如:我国标准电压为220V,普通的家用电器可以直接使用,而我的手机充电时需要用到充电器。原因是手机只支持5V、10V、11V等电压,此时手机充电器就相当于是适配器,手机支持的电压即target(目标角色),标准电压就是适配者,需要将220V的电压转换成10V的电压给手机充电(去适配手机支持的电压)。

适配器模式的优点如下:

  • 在客户端可以透明的调用目标接口
  • 可以复用原有的代码逻辑,不会对原有逻辑造成污染,如果日后不需要某个适配者,可以直接删除对应的接口而不会影响原有的代码逻辑
  • 实现了目标类和适配者的解耦,可以完美解决目标接口和适配者接口的解耦

适配器模式的缺点如下:

  • 在使用适配器模式的时候需要结合实际业务场景全面考虑,需要对业务较为熟悉
  • 如果使用不当会使代码变得凌乱,可读性降低,增加了日后维护的难度

适用场景:

        适配器模式不是在设计一个新功能的时候使用的设计模式,而是在对一个运行正常的功能进行扩展维护的时候使用的。

实际业务场景举例

        我们的报销系统有一套默认的差旅费补助计算逻辑,且运行稳定,此时某个省市推出了一套新的差旅费补助方案,为了尽可能的不影响原有代码逻辑,我们考虑使用适配器模式,该计算接口还是以原来的逻辑返回,让新的方案适配原有的方案。只需要新增一个适配者接口和一个适配器即可,不需要改动原有的代码结构。

代码实现

  • 目标角色(原有的代码逻辑)
public interface travelService {

    Map<String,Object> compute(TravelParam param);
    
}
  • 适配者角色(新的计算方案)
public interface TravelAdaptee {

  /**
   * 计算金额
   * @param param
   * @return
   */
  Map<String,Object> compute(TravelParam param);

}
@Service("gat")
public class GatTravelService implements TravelAdaptee {

  @Override
  public Map<String,Object> compute(TravelParam param) {
    Map<String,Object> resMap = new HashMap<>();
    //具体代码实现
    return resMap;
  }
}
  • 适配器角色
@Component
public class TravelAdapter {

  @Autowired
  private TravelService travelService;

  @Autowired
  private Map<String,TravelAdaptee> adapteeMap;

  public Map<String,Object> compute(TravelParam param){
    //系统默认计算方式
    if(TravelEnum.DEFAULT.getCode().equals(vo.getType())){
      return travelService.compute(param);
    }
    //新的计算方案
    return adapteeMap.get(vo.getType()).compute(param);
  }
}
  • controller层调用
@RestController
@RequestMapping("/travel")
public class TravelController {

    @Autowired
    private BaoGanAdapter baoGanAdapter;

    @PostMapping(path = "/compute")
    public Response compute(@RequestBody TravelParam param){
        return Response.success().setData(baoGanAdapter.computeBaoGanFee(param));
    }

}

        如果之后又出现了新的方案,我们继续增加适配者接口的实现类即可,如果不需要某个方案,可以直接删除相应的实现类,其他代码完全不需要改动,实现了新增代码与原有代码之间的解耦,避免了对现有代码的污染。

适配器模式与策略模式的区别

        策略模式是在新功能的代码设计阶段使用的设计模式,适配器模式是在维护原有代码时使用的设计模式,前者可以更好的避免众多if-else代码块的使用,后者避免了对现有代码的污染,都增强了代码的健壮性。

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。它通常用于解决两个已有接口之间不兼容的问题。 在给出的代码示例中,我们可以看到适配器模式的应用。在Main.cpp文件中,创建了一个Target对象指针target,并将其初始化为Adapter对象。然后调用target的request()函数,实际上调用的是Adapter的request()函数。而Adapter的request()函数内部调用了Adaptee的specificRequest()函数,完成了适配的过程。 在Head.h文件中定义了三个类:Target、Adaptee和Adapter。Target类是适配器模式中的目标接口,定义了一个虚函数request()。Adaptee类是被适配的类,它有一个特殊的请求函数specificRequest()。Adapter类是适配器类,它继承了Target类,并在其request()函数中调用了Adaptee类的specificRequest()函数。 通过适配器模式,我们可以将不兼容的两个接口进行适配,使它们能够协同工作。这在软件开发中经常用于复用已有代码或集成多个系统。 参考: C++设计模式适配器模式Adapter Head.cpp Main.cpp<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++设计模式适配器模式(Adapter)](https://download.csdn.net/download/weixin_38666785/12761879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++设计模式-适配器模式](https://blog.csdn.net/qq78442761/article/details/95766831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值