读书人

适配器模式(变压器方式)

发布时间: 2012-07-27 11:03:00 作者: rapoo

适配器模式(变压器模式)

为什么要 用适配器模式。就是把两个完全不关联或者不相同的类纠合一起时才使用这个模式。

这个模式涉及到角色:
源角色:需要适配的角色。
目标角色:期待使用的接口。
适配器角色:把源角色转化成目标角色。这个是模式的核心。着重转化功能。

适配器模式分两种情况:
类的适配器模式和对象的适配器模式 。

首先来讲讲类的适配器模式:

如下例:

指方为圆的故事。

//方形接口

public interface Square{

?? //方形具有画方形的功能

? public void drawSquare();

?? //是否是图形

? public boolean isGraphical();

}

?

这里主要是想用目标接口。。但是又要能提供画方形功能。此时目标接口如下

//圆形接口 即目标接口

public interface Circular{

?

? //具有画方形的功能

? public void drawCircular();

?

//是否都是图形

??public boolean isGraphical();

}
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

为了能使圆形接口能使用画方形功能。则适配器角色产生。适配器角色作用就是能够提供目标角色不具有的源角色功能。

接口如下

public class CircularAdator implements Circular,Square{

?? public void drawSquare(){

?????? System.out.println("我是方形接口的功能 我画方形");

? }

?

? public void drawCircular(){

??????? System.out.println("我是圆形接口的功能。我画圆形");

? }

?

?//方形和圆形都有此功能。

?public boolean isGraphical(){

??????? return true;

?}

}?

?

类适配模式。比较简单。。而且只能适合单一的类。子类和多个类都都无法重用这个适配器。如果要适配分别要针对每个子类进行适配。这样维类就会越来越臃肿。而且也不可取。

对象适配器。主要使用聚合/组合原则进行的适配。通过对上面的接口改造如下。

//被适配的接口 方形接口 拥有画方形的能力

?public? interface Square{

??? //画方形图画的能力

????public void drawSquare();

???? //是否是图形 指的是形状

??? public boolean isGraphical();

?}

?

//圆形接口,目标接口 我们需要的接口

public interface Circulare{

?? //拥有画圆形的能力

?? public void drawCirculare();

???

? //同样是图形

?? public void isGraphical();

}

?

//具体被适配的接口的实现类。。这里也可以直接适配

public class SquareAdaptee implements Square{

? //具有画方形的能力

? public void drawSquare(){

?????? System.out.println("我是方形图形噢。。")

? }

?

?public boolean isGraphical(){

?????? return true;

? }

}

?

//圆形适配器类,是我们的目标类,实现圆形接口,本身拥有画圆形的能力之外。同时需要提供方形的能力

public class CirculareAdaptor implements Circulare{

? //组合方形接口,适配

? private Square squareAdaptee;

?//构造子

? public CirculareAdaptor(Square squareAdaptee){

??? this.squareAdaptee =squareAdaptee;

?}

?? public void drawCirculare(){

?????????? System.out.println("我具有画圆形的能力噢");

? }

?? //是图形?

? public boolean isGraphical(){

??? return true;

? }

?

//委托方形去画。圆形不具有画方形的功能

public void drawSquare(){

? squareAdaptee.drawSquare();

?}

}

针对对象适配器模式。因为是使用了组合和聚合原则。源接口(被适配的类)的子类都适用这个适配器类,不需要增加具体子类的适配器类。从而减轻了类的维护成本。

缺省适配器类。

?如果源和目标接口为同一个类。又由于我们不需要源类所有方法。我们提供源类的平庸实现。后续子类继承时。我们有选择我们需要的功能方法。

?例省略。

应用场景:

?1,我们需要的目标的角色功能。但是源口接口没没有的

2,当源接口无法修改时。我们需要适配角色来达到我们需要的接口的目的。

?

读书人网 >软件开发

热点推荐