转载

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

使用的前提:

1.接口中规定了所有要实现的方法

2.但一个要实现此接口的具体类,只用到了其中的几个方法,而其它的方法都是没有用的。

这个模式也很简单,例如:你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,>虽然两个国家的的电源电压不同,中国是 220V,日本是 110V,但是这个适配器能够把这些不同的电压转换为你需要的 36V 电压,保证你的笔记本能够正常运行,那我们在设计模式中引入这个适配器模式是不是也是这个意思呢?是的,一样的作用,两个不同接口,有不同的实现,但是某一天突然上帝命令你把 B 接口转换为 A 接口,怎么办?继承,能解决,但是比较傻,而且还违背了 OCP 原则,怎么办?好在我们还有适配器模式。

适配器的通用类图

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

这个类图也很容易理解,

Target 是一个类(接口)

// 目标接口,或称为标准接口 interface Target {     public void request(); }

Adaptee 是一个接口,通过 Adapter 把 Adaptee 包装成 Target 的一个子类(实现类)

// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类 class Adaptee {     public void specificRequest() {         System.out.println("被适配类具有 特殊功能...");     } }
// 适配器类,继承了被适配类,同时实现标准接口 class Adapter extends Adaptee implements Target{     public void request() {         super.specificRequest();     } }

测试类

public class Client {  public static void main(String[] args) {   // 使用普通功能类   Target concreteTarget = new ConcreteTarget();   concreteTarget.request();   // 使用特殊功能类,即适配类   Target adapter = new Adapter();   adapter.request();  } } 

注意了这里用了个名词包装(Wrapper),那其实这个模式也叫做包装模式(Wrapper),但是包装模式可不知一个,还包括了以后要讲的装饰模式。

上面这种实现的适配器称为 类适配器 ,因为 Adapter 类既继承了 Adaptee (被适配类),也实现了 Target 接口(因为 Java 不支持多继承,所以这样来实现),在 Client 类中我们可以根据需要选择并创建任一种符合需求的子类,来实现具体功能。

实现方法

1.用一个抽象类实现已有的接口,并实现接口中所规定的所有方法,这些方法的实现可以都是“平庸”实现----空方法;但此类中的方法是具体的方法,而不是抽象方法,否则的话,在具体的子类中仍要实现所有的方法,这就失去了适配器本来的作用。

2.原本要实现接口的子类,只实现1中的抽象类即可,并在其内部实现时,只对其感兴趣的方法进行实现。

正文到此结束
Loading...