适配器模式(变压器方式)
为什么要 用适配器模式。就是把两个完全不关联或者不相同的类纠合一起时才使用这个模式。
这个模式涉及到角色:
源角色:需要适配的角色。
目标角色:期待使用的接口。
适配器角色:把源角色转化成目标角色。这个是模式的核心。着重转化功能。
适配器模式分两种情况:
类的适配器模式和对象的适配器模式 。
首先来讲讲类的适配器模式:
如下例:
指方为圆的故事。
//方形接口
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,当源接口无法修改时。我们需要适配角色来达到我们需要的接口的目的。