设计模式之适配器模式/外观模式

适配器模式

<适配器模式主要作用是进行接口的转换。当将新的类加入到并没有按原来接口规范的类中时,我们可以定义一个适配器类(他拥有原来类的引用),来包装加入的类,并且实现原来的接口,实际调用的还是被适配的方法。使得无需改动客服端代码的情况下加入新的不符合原来接口规范的类到旧的系统中去>

[ 图片来源百度百科 ]

在现实生活中我们有很多适配器模式的场景,比如各种的USB转接口,HDMI转接口等。

                   

[ 图片来源百度百科 ]

同样的在软件中我们也经常会用到这个模式,下面我们通过具体的例子来对该模式进行讲解。

我们这里有一个USB接口,通过该接口机器可以获取连接他的设备传输的信息。

interface USB{
    
    //该接口可以读取连接他设备的信息或者向其中写如数据
    public void read();
    public void write();

}

这只其中他的一个设备

class USB1 implements USB{

    public void read(){
        //读取设备信息
    }

    public void wirte(){
        //向设备写入信息
    }
}

这里是客服端代码

class Client{
    USB usb;    
    
    public void setUSB(USB usb){
        this.usb = usb; 
    }

    public static void main(String[] args){
        Client c = new Client();
        c.setUSB(new USB1());

        usb.read();  //通过接口读取信息
        usb.write(); //通过接口写入信息
    }

}

可以看到只要实现了USB接口的类,客服端都可以直接操作其进行数据的读取与写入。

但是此时我们有一个类并没有遵守该接口规范来进行对方法的编写。如下类

class IODev{
    
    public void readByte(){
        //具体操作
    }

    public void writeByte(){
        //具体操作
    }

}

该类没有遵守接口的规范客服端无法直接使用该类。但此时我们的IODev代码以及写好了不想改动(可能还有很多这样的类),客服端代码也不想变动(变动可能涉及很类的代码修改)。于是我们新设计一个类以适应客服端。这就是我们所说的适配器类

class IODevToUSB implements USB{
    public IODev ioDev;
    
    public void read(){
        ioDev.readByte();
    }
    
    pulbic void write(){
        ioDev.write();
    }
}

这个类的作用主要在于接口的转换,以适应代码之间的不兼容。可以看到该类其实就是将不适配的类进行了封装,使得客服端无需关注他具体是调用的谁的代码,而且可以在原来代码不加以改动的情况下使得系统兼容新的类。

其实该适配器类也可以实现多个接口规范(Java中是可以实现多个接口的)来适应多个不兼容的类,并将这些类进行封装来适应系统。当然这个适配是类也可以接受被适配的子类。

以上是通过实现接口来实现适配器模式的,其实还可以通过继承的方式来实现,但是需要继承两个类,Java并不支持多继承所以这里举例说这种情况了。

外观模式

<外观模式是为了简化接口而设计的,该模式和适配器模式有很多相同点,都是将类进行封装,只是使用的意图不同,一个是为了接口转换,一个是为了简化接口>

[图片来源百度百科]

该模式是将底层具体的而繁多的类和方法封装在一个装饰者类中,而客服端通过创建装饰者类,运行其方法执行一些复杂的流程。客服端无需知道具体是调用的谁的代码,也使得客服端从具体类中解耦。

举一个现实中的例子,比如我们将大象放入冰箱,先要打开冰箱,放入大象,关上冰箱,这个过程可能涉及到三个类,一个是Person  ,Elephant , Refrigerator 。如果我们我只通过客服端去写这些类可能显得代码很繁琐。于是我们写一个外观者类来将这些类进行封装,装饰者设置一个将大象放入冰箱的方法(该方法里面包含了具体的步骤),客服端只需要有这个外观类即可,然后调用该方法就能完成一件本来看起来复杂的事情。

由于外观者模式较为简单我就不写具体的代码来进行分析了。

猜你喜欢

转载自blog.csdn.net/weixin_41237676/article/details/102525097