构成jdk的开发环境(23种设计模式在jdk中的应用)
构成jdk的开发环境(23种设计模式在jdk中的应用)2 同样在微服务或者远程调用时,服务提供方的接口的定义修改会造成调用方的大量的兼容问题。这时我们如果引入了适配器模式,增加一个适配层(防腐层),就可以极大地降低程序的维护成本。1 很多时候,我们并非从零开始编程,经常会用到现有的类。特别是现有的类充分测试过,我们更愿意将它们作为组件重复利用。通过适配器模式对现有类进行适配,生成新的类,这样我们当遇到bug,或组件版本升级时,只需要修改适配器的类就能快速的解决问题。适配器模式有以下两种:使用继承使用委托
适配器模式(adapter)的启发来自于直交流电的转换。我们在使用家用电器时,经常会发现电器的电源插头上会有一个长方体的小盒子,这是干什么用的呢?以笔记本电脑为例,笔记本电脑的电压是直流12V,可是咱们国家使用的电压标准是交流220V,这就需要一个设备来进行转换,也就是上文所说的小盒子(AC适配器)。AC适配器的作用就是让工作于12V环境的笔记本电脑适合于交流220V的环境。
同样,在程序里,经常会出现我们需要的组件,在现有的环境中无法使用,需要经过一定的转换才能够使用的情况。这种转换就是我们今天的主人公——适配器模式(Adapter)。
概念适配器模式(Adapter)用于填补“现有的程序”和“所需的程序”之间的差异的设计模式。也被称为包装器模式(Wrapper),就像是用包装纸将出厂的通用商品贴牌包装成产品一样,帮我们把通用组件包装起来,使其能够适用于我们的调用方系统。
适配器模式主要包括:
- Target(对象):负责定义所需的方法。也就是事例中的笔记本电脑所需的直流12V。
- Client(请求者):负责使用Target所定义的方法进行具体处理。也就是事例中的笔记本电脑。
- Adaptee(被适配):是持有既定方法的角色,我们要使用的通用组件。即事例中的交流220电源。
- Adapter(适配):是适配器模式的关键,它的作用是使用Adaptee的方法来满足Target的需求。需要注意的是,如果Target中的方法与Adaptee方法相同,就不需要Adapter来适配了。
适配器模式有以下两种:
- 类适配器模式(使用继承的适配器)
- 对象适配器模式(使用委托的适配器)
使用继承
使用委托
使用场景1 很多时候,我们并非从零开始编程,经常会用到现有的类。特别是现有的类充分测试过,我们更愿意将它们作为组件重复利用。通过适配器模式对现有类进行适配,生成新的类,这样我们当遇到bug,或组件版本升级时,只需要修改适配器的类就能快速的解决问题。
2 同样在微服务或者远程调用时,服务提供方的接口的定义修改会造成调用方的大量的兼容问题。这时我们如果引入了适配器模式,增加一个适配层(防腐层),就可以极大地降低程序的维护成本。
3 在领域模型的六边形模型中,我们常用各种适配器来适配各种中间件、接口、数据源。如http适配器,repository适配器,中间件适配器等等,来支撑领域服务。
JDK中的Adapter模式在JDK的IO处理中,InputStreamReader和OutputStreamWriter就使用了委托的方式实现了对象适配器模式。源码如下:
public class InputStreamReader extends Reader {
private final StreamDecoder sd;
public InputStreamReader(InputStream in) {
super(in);
try {
sd = StreamDecoder.forInputStreamReader(in this (String)null); // ## check lock object
} catch (UnsupportedEncodingException e) {
// The default encoding should always be available
throw new Error(e);
}
}
// 重写了Reader中的read()方法,并委托StreamDecoder实现具体需求
public int read() throws IOException {
return sd.read();
}
...
}
InputStreamReader和OutputStreamWriter就是我们上文提到的Adapter类,它们继承了Reader和Writer,具体实现了Reader和Writer的方法。抽象类Reader和Writer即上文所说的Target,调用方调用的是Reader和Writer定义的方法。InputStreamReader有个委托变量StreamDecoder sd,同样,OutputStreamWriter有个委托变量StreamEncoder se,是上文提到的Adaptee。InputStreamReader和OutputStreamWriter委托StreamDecoder和StreamEncoder完成对Reader和Writer定义的方法的实现。
委托:指将某个方法中的实现处理交给其他实例的方法。
总结适配器模式用于填补具有不同接口(API)的两个类之间的缝隙。实现Adapter模式的方式有“使用继承”和“使用委托”两种。有了它,我们可以更快速地进行底层的兼容和版本升级。