设计模式之接口型模式-配适器模式(Adapter 模式)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34359363/article/details/82108335

说到配适器模式。我们不禁要问什么是配适器模式????

通俗的来说配适器模式就是把一个类的接口转换成客户端所期待的另一种接口,从而使原接口不匹配而无法在一起工作的两个类能在一起工作。

假设有两个类A,B. A类有某些功能,但是需要B类中的某一个模块才能工作,这个时候我们就能使用配适器模式。代码如下:

package myDesignPatternsTest.InferMode.AdapterModel;

import java.io.InputStream;

/**
 * 接口去读xml
 */
public interface XmlRead {
    public InputStream xmlReader();
}
package myDesignPatternsTest.InferMode.AdapterModel;

import java.io.InputStream;

/**
 * 接口读取xml
 */
public interface ReaderXml {
    public InputStream readXml();
}
package myDesignPatternsTest.InferMode.AdapterModel;

import java.io.InputStream;

/**
 * 类B实现了读取xml的方法
 */
public class AdapterModelB implements ReaderXml {
    @Override
    public InputStream readXml() {
        return null;
    }
}

配适器模式的第一种写法:

package myDesignPatternsTest.InferMode.AdapterModel;

import java.io.InputStream;

/**
 * 配适器模式写法one
 */
public class AdapterModelA extends AdapterModelB implements XmlRead{
    @Override
    public InputStream xmlReader() {
        return readXml();
    }
}

配适器模式的另一种写法:

package myDesignPatternsTest.InferMode.AdapterModel;

import java.io.InputStream;

/**
 * 配适器模式的第二种写法
 */
public class AdpterModelC implements XmlRead {
   AdapterModelB b =new AdapterModelB();

    @Override
    public InputStream xmlReader() {
        return b.readXml();
    }
}
package myDesignPatternsTest.InferMode.AdapterModel;

/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
       XmlRead x=new AdpterModelC();
       x.xmlReader();
    }
}

当然这只是配适器模式的最基础and最直观的实现方式了。

那么我们对配适器有了一个直观影响后,不免要问配适器有几大要素?

简而言之:配适器模式需要四大要素:目标,客户,被配饰者,配适器

这些要素的作用是什么?

目标ReaderXml接口):定义一个客户端使用的特别接口。

客户(使用配适器):使用目标接口与目标接口一直的对象合作。

被配饰者XmlRead接口):一个现存的需要匹配的接口。

配适器AdpterModelCAdpterModelA):负责将被配饰者的接口转换成目标的接口。配适器是一个具体的类,是配适器模式的核心。

那么配适器模式有的优点和缺陷又是什么?

优点:可将一个类的接口和另一个类的接口匹配起来。

缺陷:你不能或者不想修改原有的配适器母接口(XmlRead接口)。

配适器的两大分类:类配适器对象配适器

类配饰器:配适器和被配饰者是继承关系(上面的例子就是)

对象配饰器:配适器和被配饰者是委托关系。代码如下:

package com.tongye.adapters;
 
public interface TargetInterface {
    void method1();
    void method2();
}
 
/*****************************/
package com.tongye.adapters;
 
/* 源类,我们需要这个类实现接口  TargetInterface,但这个类不能被改变 
 * 源类与接口之间是没有关系的
 * */
class BeAdapted{
    public void method1(){
        System.out.println("method1");
    }
}
 
/* 这是适配器,它接受了中已有的接口并产生我们需要的接口  */
class Adapter implements TargetInterface{
    private static BeAdapted adapted;            // 声明一个BeAdapted对象引用
    public Adapter(BeAdapted adapted){        // 构造方法,接收一个BeAdapted引用作为参数
        this.adapted = adapted;
    }
    
    public void method1(){                // method1()在源类BeAdapted中有,这里直接委派
        this.adapted.method1();
    }
    
    public void method2(){                // method2()方法无法通过继承获得,需要自己声明
        System.out.println("method2");
    }
}

配适器模式就简单的介绍完了。如有不对 欢迎指正。

猜你喜欢

转载自blog.csdn.net/qq_34359363/article/details/82108335