设计模式之适配器模式
2018-02-05 10:40
148 查看
设计模式之适配器模式
定义:
将一个类的接口转换成客户希望的另一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
模式中的角色
目标(Target)角色:客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
需要适配的类(源(Adapee)角色):需要适配的类或适配者类。也就是我们要使用的接口,但是这个接口不符合我们的要求,也就是现在需要适配的接口。
适配器(Adaper)角色:适配器类是适配器模式的核心。把源接口转换成目标接口。
适配器的分类:
(1)类适配器模式
(2)对象适配器模式
例子:笔记本,PS/2键盘,usb和ps/2的转接器
类适配器模式
/**
* 被适配的类
* (相当于例子中的,PS/2键盘)
* @author mama
*
*/
public class Adaptee {
public void request(){
System.out.println("可以完成客户请求的需要的功能!");
}
}
//客户所要求的的接口
public interface Target {
void handleReq();
}
现在想要实现这个Target接口,但是不想重构,想要用上已有的Adaptee类,这时可以定义一个适配器类,继承想要使用的类,并且实现客户所要求的的接口。
/**
* 适配器 (类适配器方式)
* (相当于usb和ps/2的转接器)
* @author Administrator
*
*/
public class Adapter extends Adapteeimplements Target{
@Override
public void handleReq() {
super.request();
}
}
/**
* 客户端类
* (相当于例子中的笔记本,只有USB接口)
* @author mama
*
*/测试:
public class Client {
public void test(Targett) {
t.handleReq();
}
public static void main(String[]args) {
Client c=new Client();
Target t=new Adapter();
c.test(t);
}
}
对象适配器模式
适配器类关联已有的Adapter类,并且实现接口,这样做的好处是不在需要继承(java只支持单继承)
/**
* 被适配的类
* (相当于例子中的,PS/2键盘)
* @author mama
*
*/
public class Adaptee {
public void request(){
System.out.println("可以完成客户请求的需要的功能!");
}
}
//客户所要求的的接口
public interface Target {
void handleReq();
}
/**
* 适配器 (对象适配器方式,使用了组合的方式跟被适配对象整合)
* (相当于usb和ps/2的转接器)
* @author mama
*
*/
public class Adapter2 implements Target{
private Adapteeadaptee;
public Adapter2(Adapteeadaptee) {
super();
this.adaptee =adaptee;
}
@Override
public void handleReq() {
adaptee.request();
}
}
/**
* 客户端类
* (相当于例子中的笔记本,只有USB接口)
* @author mama
*
*/
public class Client {
public void test(Targett) {
t.handleReq();
}
public static void main(String[]args) {
Adaptee
a=new Adaptee();
Client c=new Client();
Target t=new Adapter2(a);
c.test(t);
}
}
类构造图:
优缺点:
优点:
复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
扩展性:在实现适配器功能的时候,可以自由调用自己开发的功能,从而自然地扩展系统的功能。
缺点:
过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现。所以适配器模式不适合在详细设计阶段使用它,它是一种补偿模式,专用来在系统后期扩展、修改时所用。
适用场景
1、已经存在的类的接口不符合我们的需求;
2、创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类协同工作;
3、使用一些已经存在的子类而不需要对其进行子类化来匹配接口。
4、旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。
定义:
将一个类的接口转换成客户希望的另一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
模式中的角色
目标(Target)角色:客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
需要适配的类(源(Adapee)角色):需要适配的类或适配者类。也就是我们要使用的接口,但是这个接口不符合我们的要求,也就是现在需要适配的接口。
适配器(Adaper)角色:适配器类是适配器模式的核心。把源接口转换成目标接口。
适配器的分类:
(1)类适配器模式
(2)对象适配器模式
例子:笔记本,PS/2键盘,usb和ps/2的转接器
类适配器模式
/**
* 被适配的类
* (相当于例子中的,PS/2键盘)
* @author mama
*
*/
public class Adaptee {
public void request(){
System.out.println("可以完成客户请求的需要的功能!");
}
}
//客户所要求的的接口
public interface Target {
void handleReq();
}
现在想要实现这个Target接口,但是不想重构,想要用上已有的Adaptee类,这时可以定义一个适配器类,继承想要使用的类,并且实现客户所要求的的接口。
/**
* 适配器 (类适配器方式)
* (相当于usb和ps/2的转接器)
* @author Administrator
*
*/
public class Adapter extends Adapteeimplements Target{
@Override
public void handleReq() {
super.request();
}
}
/**
* 客户端类
* (相当于例子中的笔记本,只有USB接口)
* @author mama
*
*/测试:
public class Client {
public void test(Targett) {
t.handleReq();
}
public static void main(String[]args) {
Client c=new Client();
Target t=new Adapter();
c.test(t);
}
}
对象适配器模式
适配器类关联已有的Adapter类,并且实现接口,这样做的好处是不在需要继承(java只支持单继承)
/**
* 被适配的类
* (相当于例子中的,PS/2键盘)
* @author mama
*
*/
public class Adaptee {
public void request(){
System.out.println("可以完成客户请求的需要的功能!");
}
}
//客户所要求的的接口
public interface Target {
void handleReq();
}
/**
* 适配器 (对象适配器方式,使用了组合的方式跟被适配对象整合)
* (相当于usb和ps/2的转接器)
* @author mama
*
*/
public class Adapter2 implements Target{
private Adapteeadaptee;
public Adapter2(Adapteeadaptee) {
super();
this.adaptee =adaptee;
}
@Override
public void handleReq() {
adaptee.request();
}
}
/**
* 客户端类
* (相当于例子中的笔记本,只有USB接口)
* @author mama
*
*/
public class Client {
public void test(Targett) {
t.handleReq();
}
public static void main(String[]args) {
Adaptee
a=new Adaptee();
Client c=new Client();
Target t=new Adapter2(a);
c.test(t);
}
}
类构造图:
优缺点:
优点:
复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
扩展性:在实现适配器功能的时候,可以自由调用自己开发的功能,从而自然地扩展系统的功能。
缺点:
过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现。所以适配器模式不适合在详细设计阶段使用它,它是一种补偿模式,专用来在系统后期扩展、修改时所用。
适用场景
1、已经存在的类的接口不符合我们的需求;
2、创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类协同工作;
3、使用一些已经存在的子类而不需要对其进行子类化来匹配接口。
4、旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。
相关文章推荐
- Python设计模式(二)【适配器模式】
- java23种设计模式--适配器模式(Adapter)
- 设计模式--适配器模式
- 设计模式笔记——适配器模式
- 设计模式-适配器模式
- JAVA设计模式之适配器模式
- 【js设计模式笔记---适配器模式】
- 【设计模式】适配器模式
- 设计模式之--适配器模式(adapter)
- 设计模式之结构型-适配器模式(6)
- Java设计模式之适配器模式(Adapter)
- 设计模式之适配器模式
- PHP设计模式-适配器模式
- php设计模式学习系列(八)--适配器模式
- 设计模式总结之适配器模式
- 设计模式学习笔记之-适配器模式
- Java设计模式-适配器模式
- 设计模式- 适配器模式
- 4.[研磨设计模式笔记]适配器模式
- 设计模式之适配器模式