设计模式_极简实现_适配器模式

此系列开篇,说一下目的:

  1. 笔者在实际工作中用到的设计模式十分有限,久而久之很多概念也模糊了,所以想要重新梳理一下;
  2. 网络上很多讲设计模式的文章,写的很好,但是无法给读者一个最为直观的体会,直接展示上百行代码,足够深入但不浅出;
  3. 笔者在学习过程中希望真正理解设计模式,即以自己想到的例子套用魔偶个设计模式,但是例子是否恰当,笔者也不敢拍胸脯保证,写出来的话欢迎大家批评指教。

废话不多说,先来看适配器模式。

例子:

  转换插头。

  我有一只国标插头,左零右火,地线在上面。当我去到欧洲,只能使用欧标的插座,也是左零右火,但是形状不一样,地线的接法也不一样。此时我需要一个国标转欧标的转换插头。

 

public class ChinesePlug {
    //你的国标插头
    public void provideZeroWirePlug() {
        System.out.println("ChineseZeroWirePlug");
    }
    public void provideFireWirePlug() {
        System.out.println("ChineseFireWirePlug");
    }
    public void provideGroundWirePlug() {
        System.out.println("ChineseGroundWirePlug");
    }
}
public interface EuropeanPlugIn {
    //理解为一种规范,不局限于一个插座,所有的插座都是同一规范
    public abstract void acceptZeroWirePlug();
    public abstract void acceptFireWirePlug();
    public abstract void acceptGroundWirePlug();
}
public class ChnEuAdaptor extends ChinesePlug implements EuropeanPlugIn{
    public ChnEuAdaptor() {
    }
    //把国标插头接上欧标转换器
    @Override
    public void acceptZeroWirePlug() {
        System.out.print("EuropeanZeroWirePlugIn accepts: ");
        provideZeroWirePlug();
    }
    @Override
    public void acceptFireWirePlug() {
        System.out.print("EuropeanFireWirePlugIn accepts: ");
        provideFireWirePlug();
    }
    @Override
    public void acceptGroundWirePlug() {
        System.out.print("EuropeanGroundWirePlugIn accepts: ");
        provideGroundWirePlug();
    }
}
public class Main {
    public static void main(String[] args) {
        //转换插头在手,无视国标插头的存在
        EuropeanPlugIn epi = new ChnEuAdaptor();
        //直接把转换器插插座里
        epi.acceptZeroWirePlug();
        epi.acceptFireWirePlug();
        epi.acceptGroundWirePlug();
    }
}

个人认为适配器模式的优点在于:

  1. 你不必魔改你的国标插头或者欧标插座
  2. 将国标插头接入适配器后,你可以无视国标插头的存在,在使用过程中,你用一个欧标的插头(转换器)接入了一个欧标的插座;在测试类中,ChinesePlug完全不存在

它的缺点在于:

  1. 很显然你需要多带一个适配器

当然适配器模式远不止这么简单,它的实现多种多样,这将会在之后的文章中讨论。

 

posted @ 2023-04-07 21:37  Muzphy  阅读(26)  评论(0)    收藏  举报