普通类:
package adapter_mode; /** * 普通类 * 此处当做是被需要适配的类 */ public class Adaptee { /** * 具体业务方法 */ public void request(){ System.out.println("可以完成客户请求的需要的功能!"); } }
适配器类型:
package adapter_mode; /** * 适配器类型, 适配器接口 * 面向接口编程原则, 这样可以有多种风格的适配器 */ public interface Target { /** * 处理需要被适配方法的方法 */ void handlerRequest(); }
具体适配器:
package adapter_mode; /** * 具体适配器 * 此处以类适配的方式, 继承原类 */ public class Adapter extends Adaptee implements Target { /** * 调用需要被适配方法的方法 */ @Override public void handlerRequest() { super.request(); } }
具体适配器2:
package adapter_mode; /** * 具体适配器2 * 此处以对象适配的方式, 持有原类 */ public class Adapter2 extends Adaptee implements Target { /** * 持有对原类的引用 */ private Adaptee adaptee; /** * 构造器(传入原类) */ public Adapter2(Adaptee adaptee) { this.adaptee = adaptee; } /** * 调用需要被适配方法的方法 */ @Override public void handlerRequest() { adaptee.request(); } }
类图:
新的类:
package adapter_mode; /** * 新的类, 但需要使用到原类的方法 * 此处也可以直接组合的方式引入原类, 但这不叫模式 * 适配器模式: 客户无需关心具体的类, 只和适配器打交道, 原接口方法名改了, 此处不用跟着改, 符合开闭原则 */ public class MyClass { /** * 使用原类的具体业务方法(传入具体适配器) */ public void myRequest(Target t){ t.handlerRequest(); } }
测试类:
package adapter_mode; public class Client { public static void main(String[] args) { //创建适配器对象(继承方式) Target t = new Adapter(); t.handlerRequest();//测试 //创建适配器对象(组合方式) Target t2 = new Adapter2(new Adaptee());//需要传入原类对象 t2.handlerRequest();//测试 //创建新对象 MyClass m= new MyClass(); m.myRequest(t);//传入适配器对象, 结果一样可以使用原类方法 //m.myRequest(t2); //java.io.InputStreamReader(InputStream)//InputStreamReader当做适配器, 字节流(InputStream)通过适配器转换为字符流 //java.io.OutputStreamWriter(OutputStream) } }
执行结果:
可以完成客户请求的需要的功能! 可以完成客户请求的需要的功能! 可以完成客户请求的需要的功能!
谢谢声明出处!