Android设计模式-适配器模式-结构型-1
创建型模式 (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();
}
}
运行后的结果是:
4. Android技术生活交流
微信