设计模式_极简实现_适配器模式
此系列开篇,说一下目的:
- 笔者在实际工作中用到的设计模式十分有限,久而久之很多概念也模糊了,所以想要重新梳理一下;
- 网络上很多讲设计模式的文章,写的很好,但是无法给读者一个最为直观的体会,直接展示上百行代码,足够深入但不浅出;
- 笔者在学习过程中希望真正理解设计模式,即以自己想到的例子套用魔偶个设计模式,但是例子是否恰当,笔者也不敢拍胸脯保证,写出来的话欢迎大家批评指教。
废话不多说,先来看适配器模式。
例子:
转换插头。
我有一只国标插头,左零右火,地线在上面。当我去到欧洲,只能使用欧标的插座,也是左零右火,但是形状不一样,地线的接法也不一样。此时我需要一个国标转欧标的转换插头。
public class ChinesePlug {
//你的国标插头
public void provideZeroWirePlug() {
System.out.println("ChineseZeroWirePlug");
}
public void provideFireWirePlug() {
System.out.println("ChineseFireWirePlug");
}
public void provideGroundWirePlug() {
System.out.println("ChineseGroundWirePlug");
}
}
public interface EuropeanPlugIn {
//理解为一种规范,不局限于一个插座,所有的插座都是同一规范
public abstract void acceptZeroWirePlug();
public abstract void acceptFireWirePlug();
public abstract void acceptGroundWirePlug();
}
public class ChnEuAdaptor extends ChinesePlug implements EuropeanPlugIn{
public ChnEuAdaptor() {
}
//把国标插头接上欧标转换器
@Override
public void acceptZeroWirePlug() {
System.out.print("EuropeanZeroWirePlugIn accepts: ");
provideZeroWirePlug();
}
@Override
public void acceptFireWirePlug() {
System.out.print("EuropeanFireWirePlugIn accepts: ");
provideFireWirePlug();
}
@Override
public void acceptGroundWirePlug() {
System.out.print("EuropeanGroundWirePlugIn accepts: ");
provideGroundWirePlug();
}
}
public class Main {
public static void main(String[] args) {
//转换插头在手,无视国标插头的存在
EuropeanPlugIn epi = new ChnEuAdaptor();
//直接把转换器插插座里
epi.acceptZeroWirePlug();
epi.acceptFireWirePlug();
epi.acceptGroundWirePlug();
}
}
个人认为适配器模式的优点在于:
- 你不必魔改你的国标插头或者欧标插座
- 将国标插头接入适配器后,你可以无视国标插头的存在,在使用过程中,你用一个欧标的插头(转换器)接入了一个欧标的插座;在测试类中,ChinesePlug完全不存在
它的缺点在于:
- 很显然你需要多带一个适配器
当然适配器模式远不止这么简单,它的实现多种多样,这将会在之后的文章中讨论。
浙公网安备 33010602011771号