Android设计模式

Android设计模式-19-适配器模式

2018-06-19  本文已影响37人  今阳说

1. 定义

2. 应用场景

3. 优缺点

  1. 可以让任何两个没有关联的类一起运行
  2. 提高了类的复用
  3. 增加了类的透明度
  4. 灵活性好
  1. 过多地使用适配器,会让系统非常零乱
  2. 由于 java的单继承,至多只能适配一个适配者类,而且目标类必须是抽象类

4. Android源码中的使用:

适配器模式在Android中最常见的使用就是listView,recycleView的Adapter

5. 实例演示

以常见的手机等电子产品的电源适配器为例,手机充电需要5V输入,而我国家用电输出220V,美国则是110V,那么就需要充电器这个适配器了

  1. 创建一个供电基类
abstract class Volt {
        public abstract int getVoltage();
    }
  1. 创建一个供电实现类-中国220V
 class VoltChina extends Volt {
        public int getVoltage() {
            return 220;
        }
    }
  1. 创建一个适配器基类
interface VoltAdapter {
        int getVolt();
 }

3.1. 类适配器模式的实现:类适配器继承原有类,重写其方法

    //类的适配器模式:
    class Volt220To5Adapter extends VoltChina implements VoltAdapter {

        @Override
        public int getVolt() {
            int temp = getVoltage() / 44;
            return temp;
        }
    }

3.2. 使用类适配器

    private void methodAdapterPattern() {
        // 类的适配器模式
        Phone phone = new Phone();
        phone.setVoltAdapter(new Volt220To5Adapter());
   }

4.1. 对象适配器模式的实现: 对象适配器持有原有类的引用,以此获取所需要的原有类内容,并加以处理

    //对象的适配器模式
    abstract class Volt5Adapter implements VoltAdapter {

        private final Volt volt;

        public Volt5Adapter(Volt volt) {
            this.volt = volt;
        }

        public int getVoltage() {
            return volt.getVoltage();
        }

        @Override
        abstract public int getVolt();
    }

4.2. 使用对象适配器

private void methodAdapterPattern() {
        //对象的适配器模式
        phone.setVoltAdapter(new Volt5Adapter(new VoltChina()) {
            @Override
            public int getVolt() {
                return getVoltage() / 44;
            }
        });
}
  1. 如果有一天去了美国,供电类改变了:
class VoltAmerican extends Volt {
        public int getVoltage() {
            return 110;
        }
  }

此时只要创建新的电源适配器即可,而不用对手机类进行修改,例如:

private void methodAdapterPattern() {
        //对象的适配器模式
        phone.setVoltAdapter(new Volt5Adapter(new VoltAmerican()) {
            @Override
            public int getVolt() {
                return getVoltage() / 22;
            }
        });
}
上一篇 下一篇

猜你喜欢

热点阅读