Android设计模式-适配器模式-结构型-(1)

Android设计模式-适配器模式-结构型-1

      • 0. 什么是适配器模式?
      • 1. 优缺点
      • 2. 哪些库或方法使用观察者模式来实现的?
      • 3. 举例说明-中国电器打印机在中国,美国的电压V转换使用
      • 4. Android技术生活交流

创建型模式 (3)

简单工厂、工厂法、抽象工厂模式、单例模式、建造者模式

行为型模式 (2)

观察者模式、策略模式

结构型模式 (3)

适配器模式、代理模式、装饰模式

  • Android设计模式Github项目地址: 点击跳转

0. 什么是适配器模式?

作为两个独立的接口之间的桥梁,使得两者之间可以互通。

适配器模式的结构

角色 类别 说明
Target 目标角色 是一个接口,也就是我们期待要转化成的接口
Adaptee 源角色 原始的类或接口对象
Adapter 适配器角色 把源角色转化成目标角色的类

1. 优缺点

优点:

1、可以让任何两个没有关联的类一起运行。
2、提高了类的复用。
3、增加了类的透明度。
4、灵活性好。

缺点:

1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

应用实例:

1、不同国家之间的电压不一样,在使用电器设备时的充电器,就带有电压转换器,220v->110v
2、电脑与投影屏幕之间连接线的接口不一样,需要用到转换器。
3、国人去美国不会讲英文,需要请个会英文的担当你与美国人之间翻译,这样你说的话别人就能听懂

2. 哪些库或方法使用观察者模式来实现的?

listview、recycleview、ViewPage
流类型转换InputStreamReader、OutputStreamWriter
集合和数组类型转换 Arrays.asList()


3. 举例说明-中国电器打印机在中国,美国的电压V转换使用

小明在中国买了个打印机,由于是中国产的打印机,默认的电压接口是220V。但是有一天小明带着打印机飞去美国了,发现美国需要120V电压才能让打印机工作。于是就买了个电压适配器,将220V转换成120V。

电器: 打印机
源: 中国220V电压接口。作为打印机的原始接口
目标: 美国120V电压接口。作为电压适配器,将源转换到的目标
适配器:电压适配器类,实现源: 接口,并持有目标: 接口引用。

CNVoltage 源的抽象类,定义接口
CNVoltageImpl 源的的具体实现类,实现源接口,中国是220v电压
USAVoltage 源的抽象类,定义接口
USAVoltageImpl 源的的具体实现类,实现源接口,美国是120v电压
VoltageAdapter电压适配器
Printer打印机,默认持有接口(中国220V电压),并提供使用电器方法
AdapterPatternActivity activity

  • 1.CNVoltage
public interface CNVoltage {
    void connect(); //开始电器连接
    int getVoltage(); //设定电压
}
  • 2.CNVoltageImpl
public class CNVoltageImpl implements CNVoltage {
    @Override
    public void connect() {
        System.out.println(AdapterPatternActivity.TAG+"源:打印机以 "+getVoltage()+"伏电压工作");
    }

    @Override
    public int getVoltage() {
        return 220;
    }
}

  • 3.CNVoltage
public interface USAVoltage {
    void connect(); //开始电器连接
    int getVoltage(); //设定电压
}
  • 4.USAVoltageImpl
public class USAVoltageImpl implements USAVoltage {
    @Override
    public void connect() {
        System.out.println(AdapterPatternActivity.TAG+"目标:打印机以 "+getVoltage()+"伏电压工作");
    }

    @Override
    public int getVoltage() {
        return 120;
    }
}
  • 5.VoltageAdapter
public class VoltageAdapter implements CNVoltage {
    /**
     * 持有美国电压器的引用
     */
    private USAVoltage usaVoltage;
    public VoltageAdapter(USAVoltage usaVoltage){
        System.out.println(AdapterPatternActivity.TAG+"使用电压适配器,将中国的220V电压,转换为目标电压 "+usaVoltage.getVoltage());
        this.usaVoltage = usaVoltage;
    }
    @Override
    public void connect() {
        usaVoltage.connect(); //将 源(中国电压)的方法,用目标(美国电压)的方法替代,这样就实现了在中国的打印机使用120V电压
    }
    @Override
    public int getVoltage() {
        return usaVoltage.getVoltage();
    }
}
  • 6.Printer
public class Printer{
    /**
     * 给打印机配置一个电压,由于是中国产的,所以默认是中国电压
     */
    private CNVoltage mCnVoltage;
    public Printer(CNVoltage cnVoltage){
        System.out.println(AdapterPatternActivity.TAG+"实例化一个打印机,并配置电压 "+cnVoltage.getVoltage());
        this.mCnVoltage = cnVoltage;
    }

    /**
     * 连接电源
     */
    public void doConnect(){
        mCnVoltage.connect();
    }
}
  • 7.AdapterPatternActivity
public class AdapterPatternActivity extends AppCompatActivity {
    public static String TAG = "适配器模式:>> ";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_adapter_pattern);

        System.out.println(AdapterPatternActivity.TAG+"小明在中国:>>");
        //获取中国电压器220V
        CNVoltage cnVoltage = new CNVoltageImpl();
        //将电压器220V配置给打印机
        Printer printerA = new Printer(cnVoltage);
        //打印机配置好220V电压后,就可以工作了
        printerA.doConnect();

        System.out.println("\n"+AdapterPatternActivity.TAG+"小明带着打印机飞到了美国:>>");
        //获取美国电压器120V
        USAVoltage usaVoltage = new USAVoltageImpl();
        //装一个电压适配器,将美国的电压120装进去
        VoltageAdapter voltageAdapter = new VoltageAdapter(usaVoltage);
        //将电压适配器,配置给打印机
        Printer printer = new Printer(voltageAdapter);
        //打印机配置好120V电压后,就可以工作了
        printer.doConnect();
    }
}

运行后的结果是:

Android设计模式-适配器模式-结构型-(1)_第1张图片


4. Android技术生活交流

微信


Android设计模式-适配器模式-结构型-(1)_第2张图片


[1]* 参考文章
[2]* 参考文章
[3]* 参考文章
[4]* 参考文章
[5]* 参考文章
[6]* 参考文章

你可能感兴趣的:(Android架构设计)