1 Adapter Pattern 适配器模式
目的:作为两个不兼容的接口之间的桥梁,结合两个独立接口的功能;
实现:用接口和继承或者组合的方式实现适配器模式。
1.主要解决在软件系统中,常常要将一些”现存的对象”放到新的环境中,而新环境要求的接口是现对象不能满足的;
2.客户和被适配者是解耦的,一个不知道另一个;
3.这个模式是如何把客户和接口绑定起来,而不是和实现绑定起来的。我们可以使用数个适配器,每一个都负责转换不同组的后台类。或者,也可以加上新的实现,只要它们遵守目标接口就可以。
2 实现
代码场景:吃火锅和K歌是两件不同的事,但现在可以吃着火锅唱着歌了。
2.1 代码实现
火锅接口
public interface HuoGuo {
void eat(String type);
}
火锅实现类:海底捞
public class HaiDiLao implements HuoGuo {
@Override
public void eat(String whitchOne) {
// 麻辣锅
if ("麻辣".equals(whitchOne)) {
maLa();
}
// 三鲜锅
if ("三鲜".equals(whitchOne)) {
sanXian();
}
// 鸳鸯戏水锅
if ("鸳鸯".equals(whitchOne)) {
yuanYang();
}
// 情节需要
System.out.println("吃了一个粉带后,她放下筷子~");
}
private void maLa() {
System.out.println("麻辣锅,今天上边爽,明天下边爽~");
}
private void sanXian() {
System.out.println("三鲜锅,我吃的不是味道,而是菜~");
}
private void yuanYang() {
System.out.println("鸳鸯锅,想吃哪个吃那个~");
}
}
火锅实现类:小九重庆火锅
public class XiaoJiu implements HuoGuo {
@Override
public void eat(String whitchOne) {
// 小九火锅只提供九宫格
if ("九宫格".equals(whitchOne)) {
jiuGongGe();
}
}
private void jiuGongGe() {
System.out.println("九宫格,九宫格,想放哪格放哪格~");
// 情节需要
System.out.println("吃了一个鱼丸后,她放下筷子~");
}
}
Ktv接口
public interface Ktv {
// 唱歌 想怎么唱 唱什么歌
void sing(String how, String whitchOne);
}
适配器类:美团外卖
public class MeiTuanAdapter implements Ktv {
private HuoGuo huoGuo;
@Override
public void sing(String how, String whitchOne) {
if ("吃着火锅唱着歌".equals(how)) {
chiHuoGuo(whitchOne);
huoGuo.eat(whitchOne);
// 不想增加入参了 写死一首歌 ^_^
System.out.println("站起来,唱了一首[辣妹子辣]~");
}
}
private void chiHuoGuo(String whitchOne) {
// 打开美团外卖
if ("九宫格".equals(whitchOne)) {
huoGuo = new XiaoJiu();
} else {
huoGuo = new HaiDiLao();
}
}
}
Ktv实现类:周杰伦的真爱范特西ktv
public class FantasyKtv implements Ktv {
private MeiTuanAdapter md = new MeiTuanAdapter();
@Override
public void sing(String how, String whitchOne) {
if ("只唱歌".equals(how)) {
System.out.println("她站起来,唱了一首[" + whitchOne + "]~");
System.out.println("初听不知曲中意,再唱已是曲中人~");
}
if ("吃着火锅唱着歌".equals(how)) {
//打开了美团外卖
md.sing(how, whitchOne);
}
}
}
2.2 涉及角色
在适配器模式中包含如下几个角色:
Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。
2.3 调用
调用者:
public class Client {
public static void main(String[] args) {
// 周董的真爱范特西KTV
System.out.println("-- 三个闺蜜来到真爱范特西KTV门口 --");
FantasyKtv fk = new FantasyKtv();
// 决定只唱歌
System.out.println("-- 她们决定进去唱歌 --");
fk.sing("只唱歌", "后来");
System.out.println("-- 她失恋一年多了还是忘不了他,旁边的闺蜜也跟着泪流不止 --");
System.out.println("-----------分割线------------");
// 决定吃着火锅唱着歌
System.out.println("-- 他们决定吃着火锅唱着歌 --");
fk.sing("吃着火锅唱着歌", "九宫格");
System.out.println("-----------分割线-------------");
fk.sing("吃着火锅唱着歌", "麻辣");
System.out.println("-----------分割线-------------");
}
}
结果:
-- 三个闺蜜来到真爱范特西KTV门口 --
-- 她们决定进去唱歌 --
她站起来,唱了一首[后来]~
初听不知曲中意,再唱已是曲中人~
-- 她失恋一年多了还是忘不了他,旁边的闺蜜也跟着泪流不止 --
-----------分割线------------
-- 他们决定吃着火锅唱着歌 --
九宫格,九宫格,想放哪格放哪格~
吃了一个鱼丸后,她放下筷子~
站起来,唱了一首[辣妹子辣]~
-----------分割线-------------
麻辣锅,今天上边爽,明天下边爽~
吃了一个粉带后,她放下筷子~
站起来,唱了一首[辣妹子辣]~
参考文献:
[ 1 ] 图解设计模式/(日)结城浩著;杨文轩译。–北京:人民邮电出版社,2017.1.
[ 2 ] 维基百科 设计模式
[ 3 ] 极客学院WIKI–设计模式.
[ 4 ] 菜鸟教程–设计模式.


被折叠的 条评论
为什么被折叠?



