一、举一个栗子
如果想让额定工作电压是直流12V的笔记本电脑在交流100V的AC电源下工作,应该怎么做呢?通常,我们会使用AC适配器,将家庭用的交流100V电压转换成我们所需要的直流12V电压。这就是适配器的工作,它位于实际情况与需求之间,填补两者之间的差异。
在程序世界中,经常会存在现有的程序无法直接使用,需要做适当的变换之后才能使用的情况。这种勇于填补“现有的程序”和“所需的程序”之间差异的设计模式就是“适配器模式”
适配器有以下两种:
- 类适配器模式(使用继承的适配器)
- 对象适配器模式(使用委托的适配器)
二、模式的结构
三、实例程序(使用继承的适配器)
- 这里的示例程序是一段会将输入的字符串显示为
(hello)
或者*hello*
的简单程序。 - 目前在Banner类(Banner有广告横幅的意思)中,有将字符串用括号括起来的
showWithParen
方法,和将字符串用*
号括起来的showWithAster
方法。我们假设这个Banner类是类似前文中的“交流100V电压”的实际情况。 - 假设Print接口中声明了两个方法,即弱化字符串显示(加括号)的printWeak方法,和强调字符串显示(加
*
)的printStrong方法。我们假设这个接口是类似于前文中的“直流12V电压”的“需求”。 - 现在要做的事情就是使用Banner类编写一个实现了Print接口的类,也就是说要做一个将“交流100V电压”转换成“直流12V电压”的适配器。
1. Banner
类
2. Print
接口
3. PrintBanner
类
4. Main
类
这里我们将PrintBanner类的实例保存在了Print类型的变量中。在Main类中,我们是使用Print接口来进行编程的。对Main类的代码而言,Banner类、showWithParen方法和showWithAster方法被完全隐藏起来了。这就好像笔记本电脑只要在直流12V电压下就能正常工作,但它并不知道这12V电压是由适配器将100V电压转换而成的。Main类并不知道PrintBanner类是如何实现的,这样就可以在不用对Main类进行修改的情况下改变PrintBanner类的具体实现。