php做网站验证码的设计,安徽建设学校官方网站,商标设计思路,成都营销网站建设团队适配器模式
这个更加好理解#xff0c;就是做适配功能的类#xff0c;例如#xff0c;现在手机没有了圆形耳机接口#xff0c;只有Type-C接口#xff0c;因此你如果还想要使用圆形耳机的话需要买个圆形接口转Type-C的转换器#xff08;适配器#xff09;#xff0c;这…适配器模式
这个更加好理解就是做适配功能的类例如现在手机没有了圆形耳机接口只有Type-C接口因此你如果还想要使用圆形耳机的话需要买个圆形接口转Type-C的转换器适配器这就是所谓的适配器将一个类的接口转换成客户希望的另外一个接口使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类适配器模式和对象适配器模式前者类之间的耦合度比后者高且要求程序员了解现有组件库中的相关组件的内部结构所以应用相对较少些。
适配器模式Adapter包含以下主要角色
目标Target接口当前系统业务所期待的接口它可以是抽象类或接口。适配者Adaptee类它是被访问和适配的现存组件库中的组件接口。适配器Adapter类它是一个转换器通过继承或引用适配者的对象把适配者接口转换成目标接口让客户按目标接口的格式访问适配者。
类适配器模式
适配器类来实现当前系统的业务接口同时又继承现有组件库中已经存在的组件。使用一个例子来说明类适配器模式现有一台电脑只能读取SD卡而要读取TF卡中的内容的话就需要使用到适配器。创建一个读卡器将TF卡中的内容读取出来。
举个非常好理解的例子就好比A是欧洲人B是日本人欧洲有个芯片公司只允许欧洲人外貌的人进入吃饭并学习芯片技术此时日本人想要进去是不行的会被门卫驱赶。这个时候B最好的方式就是找个适配器也就是找一套人皮面具扮演成欧洲人就能进去进去之后吃饭还是这个日本人吃学习芯片技术也是这个日本人只不过使用人皮面具蒙混过关而已。而下面是使用SDAdapterTF类 通过implements SDCard 来穿上人皮面具以适配Computer类方法的参数类型多态牛逼而这个多态的运用就是这个人皮面具而真正功能的实现还是要靠TFCardImpl来实现而使用TFCardImpl又有两种方式这里讲第一种通过继承的方式——类适配器模式。
类图如下
代码
首先定义我们的电脑实体类、SD卡实体类和TF卡实体类电脑类仅能读取SD卡即参数只能传入SDCard的子类如下
// 定义Computer类
public class Computer {private String type;public String readSDCard(SDCard sdCard){if(sdCardnull){System.out.println(SD 卡损坏);}return sdCard.readSD();}public void writeSDCard(SDCard sdCard,String msg){sdCard.writeSD(msg);}
}// 定义SDCard接口
public interface SDCard {String readSD();void writeSD(String msg);
}// 定义TFCard接口
public interface TFCard {String readTF();void writeTF(String msg);
}// SDCard的实现类
public class SDCardImpl implements SDCard{Overridepublic String readSD() {return SD卡读出内容Hello World!;}Overridepublic void writeSD(String msg) {System.out.println(SD卡写入内容msg);}
}// TFCard的实现类
public class TFCardImpl implements TFCard{Overridepublic String readTF() {return TF卡读出内容Hello World!;}Overridepublic void writeTF(String msg) {System.out.println(TF卡写入内容msg);}
}接着定义适配器类我们电脑只能接受SDCard的子类而真正完成TF卡的读取功能的是得是TFCard的实现类TFCardImpl 因此这个适配器应该完全具有TFCardImpl的所有功能因此需要直接继承TFCardImpl即可那么如何还要让适配器成为SDCard的子类呢因为前面已经继承了一个类因此后面我们使用实现方式实现SDCard接口成为SDCard的子类。这里废话一句这里的SDCard就好比上面举例的欧洲人皮面具TFCardImpl好比的是那个日本人。 public class SDAdapterTF extends TFCardImpl implements SDCard{// 特别注意继承了实现类实现了SDCard的接口Overridepublic String readSD() {return super.readTF(); // 调用继承的父类TFCardImpl的方法}Overridepublic void writeSD(String msg) {super.writeTF(msg); // 调用继承的父类TFCardImpl的方法}
}客户端测试
public class Main {public static void main(String[] args) {Computer computer new Computer();// 对于SD卡是可以直接读取的SDCardImpl sdCard new SDCardImpl();String msg computer.readSDCard(sdCard);System.out.println(msg);computer.writeSDCard(sdCard,你好世界!);// 对于TF卡不能直接读取而要借助适配器来调用TF实现类的方法
// TFCardImpl tfCard new TFCardImpl();
// computer.readSDCard(tfCard)SDAdapterTF sdAdapterTF new SDAdapterTF();msg computer.readSDCard(sdAdapterTF);System.out.println(msg);computer.writeSDCard(sdAdapterTF,你好世界);}
}输出 SD卡读出内容Hello World! SD卡写入内容你好世界! TF卡读出内容Hello World! TF卡写入内容你好世界 可以看到上述适配器SDAdapterTF实际上就是读卡器嘛只不过我们的电脑只能接受SD卡的插口SDAdapterTF扮演的就是TF转SD接口的读卡器。因此其实是让SDAdapterTF继承了TFCardImple因此可以在里面直接调用TFCardImple的方法而SDAdapterTF由是SDCard的接口实现类因此也可以传入到Computer的被读取多态是面向对象的灵魂超级灵活
缺点 类适配器模式违背了合成复用原则。类适配器是客户类有一个接口规范的情况下可用反之不可用。那么这时你可能已经想到了我可以不继承TFCardImple吗直接传入TFCardImpl不就好了吗是的这种模式非常接近我们的日常生活。也就是下面要讲的对象适配器模式。
对象适配器模式
紧接着上面使用的是继承实现这里我们讲解第二种实现方式通过构造器方法传递TFCardImpl对象来实现实现方式对象适配器模式可釆用将现有组件库中已经实现的组件引入适配器类中该类同时实现当前系统的业务接口。我们使用对象适配器模式将读卡器的案例进行改写。类图如下 代码
这里只是需要修改一下适配器就行如果不继承TFCardImpl 还想要调用它的方法应该如何做呢很简单让TFCardImpl 的对象作为参数传进来就行如下
public class SDAdapterTF implements SDCard {private TFCard tfCard;public SDAdapterTF(TFCard tfCard){this.tfCard tfCard;}Overridepublic String readSD() {return tfCard.readTF();}Overridepublic void writeSD(String msg) {tfCard.writeTF(msg);}
}客户端测试
public class Main {public static void main(String[] args) {Computer computer new Computer();// 对于SD卡是可以直接读取的SDCardImpl sdCard new SDCardImpl();String msg computer.readSDCard(sdCard);System.out.println(msg);computer.writeSDCard(sdCard,你好世界!);// 对于TF卡需要是有适配器类读取TFCard tfCard new TFCardImpl();SDAdapterTF sdAdapterTF new SDAdapterTF(tfCard);msg computer.readSDCard(sdAdapterTF);System.out.println(msg);computer.writeSDCard(sdAdapterTF,你好世界);}
}输出 SD卡读出内容Hello World! SD卡写入内容你好世界! TF卡读出内容Hello World! TF卡写入内容你好世界 对象适配器模式其实更加贴近我们的直觉一般我们将TF卡使用读卡器插入到电脑而这里的SDAdapterTF对象就是 读卡器TF 卡只不过类适配器模式将TFCardImpl直接继承了相当于焊丝了。而我们的对象适配器模式获取到TFCardImpl是通过构造方法获取到的更加灵活因此总结来说类适配器直接继承而对象适配器通过构造方法获取对象仅此而已
注意还有一个适配器模式是接口适配器模式。当不希望实现一个接口中所有的方法时可以创建一个抽象类Adapter 实现所有方法。而此时我们只需要继承该抽象类即可。
使用场景 如果两个类做同一件事例如本题的存储卡都是完成数据存取功能的还比如读取不同编码文件的类即我有的方法你也要有只不过各自的方法具体做的不一样方法中的有些细节不同可以使用适配器屏蔽掉接口类型的不一致性。
参考内容 传智播客设计模式相关笔记主要 https://zhuanlan.zhihu.com/p/369272002