设计模式主要有23种,大致可分为三类:创建型,机构行,行为型;具体如下:
创建型
1,单例设计模式
2,工厂设计模式
3,建造者设计模式
4,原型设计模式
结构型
5,代理设计模式
6,桥接设计模式
7,装饰设计模式
8,适配器设计模式
9,外观设计模式
10,享元设计模式
11,组合设计模式
行为型
持续更新中...
结构型简介
结构型模式主要总结了一些类或对象组合在一起的经典结构,这些经典的结构可以解决特定应用场景的问题。结构型模式包括:代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式。
适配器模式
简介
适配器模式(Adapter Design Pattern),这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不匹配而不能一起工作的类能够在一起工作。
使用场景
1,想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能将来要引进的类一起工作;
2,系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容;
3,需要一个统一的输出接口,而输入端的类型不确定;
4,替换依赖的外部系统
5,兼容老版本接口
6,封装有缺陷的接口设计
分类
适配器模式主要有两种:一是,类适配器模式;二是,对象适配器模式;其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。
类适配器
UML图
Target:目标,也就是我们想要得到的接口;注意,这里是类适配器模式,所以目标不可以是类;
Adaptee:需要似乎配的接口
Adapter:适配器角色,也是此模式的核心;适配器把源接口转换成目标接口。所以这个角色不可以是接口,而是具体类;
示例:
手机充电器想必大家都用过,就是把220V转换位5V或者9V;其中5V或9V电压就是Target接口,220V电压就是Adaptee类,而把220V转换位5V或9V就是Adapter;代码如下:
Target角色
public interface FiveOrNineVolt {
int getFiveVolt();
int getNineVolt();
}
Adaptee角色,需要被转换的对象
public class Volt220 {
public int getVolt220() {
return 220;
}
}
Adapter角色,220V适配为5V或9V
public class VoltAdapter extends Volt220 implements FiveOrNineVolt {
@Override
public int getFiveVolt() {
return 5;
}
@Override
public int getNineVolt() {
return 9 ;
}
}
对象适配器
和类适配器异议,对象适配器也是把被适配的类的Api转换为目标类的Api,与类适配器不用的是,对象适配器不是使用继承连接到Adaptee类,而是使用代理关系连接到Adaptee类;
UML图
示例
还是以上面电源适配为例,从UML图中看出,Adaptee类(Volt220)中并没有getVolt5()和getVolt9()这两个方法,而客户端需要这个方法。为了是客户端能够使用Adaptee类,需要提供一个包装类Adapter。而这个包装类包装了一个Adaptee的实例,从而使此包装类能够把Adaptee的Api与Target类的Api衔接起来;
示例代码:
Target角色
public interface FiveOrNineVolt {
int getFiveVolt();
int getNineVolt();
}
Adaptee角色,需要被转换的角色
public class Volt220 {
public int getVolt220() {
return 220;
}
}
Adapter适配器角色
public class VoltAdatper2 implements FiveOrNineVolt {
private Volt220 volt220;
public VoltAdatper2(Volt220 volt220) {
this.volt220 = volt220;
}
@Override
public int getFiveVolt() {
return 0;
}
@Override
public int getNineVolt() {
return 0;
}
}
对象适配直接将被适配对象传递到Adapter中,使用组合的形式实现接口兼容的效果。比类适配器方式更为灵活,他的一个好处就是被适配对象中的方法不会爆露出来,而类适配方式由于继承了被适配对象,因此,被适配对象类的函数在Adapter类中也都含有;对象适配模式从这点来说更加灵活,使用;
两者如何选择:
1,如果 Adaptee 接口并不多,那两种实现方式都可以。
2,如果 Adaptee 接口很多,而且 Adaptee 和 ITarget 接口定义大部分都相同,那我们推荐使用类适配器,因为 Adaptor 复用父类 Adaptee 的接口,比起对象适配器的实现方式,Adaptor 的代码量要少一些。
3,如果 Adaptee 接口很多,而且 Adaptee 和 ITarget 接口定义大部分都不相同,那我们推荐使用对象适配器,因为组合结构相对于继承更加灵活。
实际运用
做Android开发的同学大家应该都熟悉RecycleView 和ListView,在使用这个两个控件的时候,都需要自定义Adapter,RecycleView和ListView使用的不是同一个Adapter;这个Adapter就是对适配器模式很好的运用;