适配器模式:用武之地-->
将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容
而不能一起工作的那些类可以一起工作
【补充:适配器模式是为了在面向接口编程中更好的复用。如果你的系统中没有使用到
面向接口编程,没有使用到多态,就不会使用到适配器模式。】
配器模式分类: 类器模式, 对象适配器模式;
区别:类器模式通过继承完成适配任务,对象适配器通过组合来完成
(由于在 java 中不支持多重继承,而且继承有破坏封装之嫌,都提倡使用组合来代替)
在eclipse中开发:
测试类: 介绍整体需求, 和实现思路, 并测试最终的结果
/**测试适配器模式: 调用客户端接口,实现想要的所有功能 ---->在陆地飞速行进f1(),在海上飞速行进f2(),在天空飞速行进f3(); 但是它只实现了部分功能,天上飞功能没有实现,怎么办? 只能添加相应子类来实现了,如果f3()代码太多了的话, 写起来岂不费劲! 而幸运的是有人实现了此方法,于是我就把它拿过来用就行! 通过持有该类对象,调用它的方法,让它去完成相应任务吧, 免得自己亲自再动手造轮子! */ public class Test_adapterMode { public static void main(String[] args) { //调用客户端接口: /**原始的客户端:只有两个子类Son1,Son2-----仅有两个方法 Target_Father f1=new Son1();//该子类:实现了f1() Target_Father f2=new Son2();//该子类:实现了f2() f1.move();//开车到处飞跑......总投入30万 f2.move();//开轮船到处航行......总投入100万*/ //添加了新功能的客户端:借用了别人的技能,只花很小的代价就实现了f3() Target_Father f3=new Son3_Adapter_borrower();//该子类:间接地实现了f3() f3.move();;//由航空公司提供飞机,买一张票,就能飞上天....总投入:1千元 } }
第一级目录:服务接口【所提供的抽象服务】,第三方供应商擅长的服务【物美价廉,便宜好用】
/**目标对象:提供给客户端调用的接口---实现快速移动的解决方案 ----------->子类: Son1自己购买了汽车,使得在陆地上快速移动, Son2自己购买了轮船,在海上快速移动 Son3想在天上飞,却不想自己动手解决,找航空公司买一张票(没有自己实现,要借助别人帮忙) */ public interface Target_Father { public abstract void move();//使得客户快速移动 } //第三方供应商==>拥有技能者: 具有某方法的实现 public class Skills_Adaptee_owner { public void OneTicketOneFly(){ System.out.println("由航空公司提供飞机,买一张票,就能飞上天....总投入:1千元"); } }
第二级目录:具体的子类实现各自的解决方案
//子类1 public class Son1 implements Target_Father { @Override public void move() { System.out.println("开车到处飞跑......总投入30万"); } } //子类2 public class Son2 implements Target_Father { @Override public void move() { System.out.println("开轮船到处航行......总投入100万"); } } //子类3: /**缺少某技能者:能力不足,或爱偷懒,没有实现自己的任务, 于是让别人帮忙解决*/ public class Son3_Adapter_borrower implements Target_Father{ //属性:持有一个技能辅助者对象 private Skills_Adaptee_owner owner; //构造:配置一个技能辅助者对象 public Son3_Adapter_borrower(){ owner=new Skills_Adaptee_owner(); } @Override public void move() {//借助别人完成自己的任务 owner.OneTicketOneFly(); } }