适配器模式
1.不适用适配器
/**
* 航行
*/
public class HangXing {
public void sail(){
System.out.println("扬帆起航!");
}
}
/**
* 划桨
*/
public class HuaJiang {
public void row(){
System.out.println("用力划桨,驱动船只!");
}
}
/**
* 只会说启航并不划桨的老船长
*/
public class ChuanZhang {
private HangXing hangXing;
public ChuanZhang(HangXing hangXing) {
this.hangXing = hangXing;
}
/**
* 开始冒险
*/
public void startAdventures(){
hangXing.sail();
}
}
//小明船长按照惯例扬帆起航,而船却纹丝不动。。。
System.out.println("-------笨蛋小明-------");
ChuanZhang xiaoMing = new ChuanZhang(new HangXing());
xiaoMing.startAdventures();
2.使用适配器
public class HangXingAdapter extends HangXing{
private HuaJiang huaJiang;
public HangXingAdapter(){
this.huaJiang = new HuaJiang();
}
/**
* 违反了里氏替换原则(子类最好不要重写父类方法)
* 所以使用适配器模式是不得已才使用的(可能是原来的类结构没设计好或要适配第三方的接口/类)
*/
@Override
public void sail() {
super.sail();
huaJiang.row();
}
}
// 小红很聪明,雇佣了HangXingAdapter来驱动HuaJiang来划桨
ChuanZhang xiaoHong = new ChuanZhang(new HangXingAdapter());
xiaoHong.startAdventures();
3.总结
适配器模式是不得已才使用的(可能是原来的类结构没设计好或要适配第三方的接口/类),比如上例ChuanZhang类的设计初衷可能就是仅仅会喊杨帆起航而已,但后来由于需求的修改在某些地方ChuanZhang也能划桨,也无法直接修改原来的类,这时的最佳实践就是使用是适配器模式。