vczh的日常 2017-11-30
小C:小Y,家里的插孔没有两孔的怎么办?
小Y:so easy,淘宝电源转换插头包邮只要九块九毛九,真的只要九块九毛九。
......
小C:iPhone x变成Lightning接头,传统的耳机会不会用不了?
小Y:又没有这么牛叉的机,你问这个干啥呢(小Y有点不好的预感啊)?买个转换线呗。
小C:哦,没事就问问。
后来呢,小Y几个月只能吃泡面了过日子了,呜呜呜......
其实大家也要学学小Y这种为博红颜一笑,勒紧裤头吃泡面的无谓精神(一定要看好自己的信用卡啊)。言归正传,现实生活中有各种各样的适配器,方便至极,那么,适配器这样的工作,在我们的程序里有吗?答案是必须的,适配器模式。
文章内容思维导图将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。即定义一个包装类,用于包装不兼容接口的对象。
Target目标角色
该角色定义把其他类转换为何种接口,也就是我们的期望接口。
Adaptee源角色
需要转换成目标角色的源角色,它是已经存在的、运行良好的类或对象,经过适配器角色的包装,它会成为一个崭新的角色。
Adapter适配器角色
适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建立的,它的职责非常简单:把源角色通过继承或者类关联的方法转换为目标角色。
好了,该是让这次的主角iPhone差的转换线出场了(无限心伤中.....)
在这之前还需要知道适配器模式的形式分为:类的适配器模式和对象的适配器模式。
两者的差别就是一个是通过继承,一个是通过组合,利用实例的方式去进行
(1)两者实现代码的相同部分
①iPhone X手机接口(Target接口)
public interface PhoneInterface { /** * Lightning耳机接口 */ void lightningHeadSet(); }
②Lightning接口耳机
public class LightningHeadSet implements PhoneInterface { @Override public void lightningHeadSet() { System.out.print("使用Lightning接口的耳机连接。"); } }
③传统耳机接口(源类Adaptee)
public interface TraditionPhoneInterface { /** * 传统耳机接口 */ void traditionHeadSet(); }
④传统接口耳机
public class TraditionHeadSet implements TraditionPhoneInterface{ @Override public void traditionHeadSet() { System.out.print("使用传统接口的耳机连接。"); } }
(2)类的适配器模式的实现
创建适配器类(继承传统耳机(源类)和实现Linghtning接口(Target))
public class HeadSetAdapter extends TraditionHeadSet implements PhoneInterface{ @Override public void lightningHeadSet() { super.traditionHeadSet(); } }
为什么会去继承TraditionHeadSet和实现PhoneInterface呢?是因为用户最终是需要用到Lightning接口去实现听歌,所以要调用lightningHeadSet(),但是适配器的作用就是让传统耳机实现Lightning的转化,最终用传统耳机都能够得到连接。
(3)对象的适配器模式的实现(推荐)
public class ObjectHeadSetAdapter implements PhoneInterface { private TraditionPhoneInterface traditionHeadSet; public ObjectHeadSetAdapter(TraditionPhoneInterface traditionHeadSet) { this.traditionHeadSet=traditionHeadSet; } @Override public void lightningHeadSet() { traditionHeadSet.traditionHeadSet(); } }
为什么只实现PhoneInterface接口的理由同上。
(4)客户端输出
public class Client { public static void main(String[] args){ //直接通过lightning接口连接 LightningHeadSet lightningHeadSet=new LightningHeadSet(); lightningHeadSet.lightningHeadSet(); //通过类的适配器进行连接 HeadSetAdapter headSetAdapter=new HeadSetAdapter(); headSetAdapter.lightningHeadSet(); //通过对象的适配器进行连接 TraditionPhoneInterface traditionSet=new TraditionHeadSet(); ObjectHeadSetAdapter objectHeadSetAdapter=new ObjectHeadSetAdapter(traditionSet); objectHeadSetAdapter.lightningHeadSet(); } }
输出的结果为:
①使用Lightning接口的耳机连接。 ②使用传统接口的耳机连接。 ③使用传统接口的耳机连接。
(1)优点
(2)缺点
(1)优点
(2)缺点
(1)优点
(2)缺点
在选用适配器模式的时候根据需要来选用合适的实现方式,尽量使用对象的适配器模式,多用动态组合合、少用继承。
Android技术交流吧前几篇介绍了设计模式的特性并且详细讲解了4种创建型模式,创建型模式是负责如何产生对象实例的,接下来讲讲结构型模式。结构型模式是解析类和对象的内部结构和外部组合,通过优化程序结构解决模块之间的耦合问题。