结构型:Adapter与Facade(适配器和外观模式)
一般作为阅读材料,首先想要明确的是我现在了解的设计模式的初衷,即为了解决什么问题。
适配器,如果有买过港版Iphone在内地使用的人应该会有三角大插头必须接一个转换器才能在一般的插座上使用的情况,当然这只是比较直观的感受。其实我们平时用的手机充电器都是属于适配器,试想如果我们没有这个充电器,我们如何利用普通插座给手机充电?
适配器的定义:将手头上所持有的接口转换成我们需要的接口(业务场景:经常是为了适配旧程序或者对接2套系统的时候使用,当你无法使你的对接系统做修改的时候,往往需要我们自己做适配。)
适配器的结构:
目标对象-target
被适配者-adapted
适配器-adapter
demo:
package top.gabin.oa.web.design.adapter; /** * 想办法 * * @author linjiabin on 16/5/5 */ public interface Think { String idea(); }
package top.gabin.oa.web.design.adapter; /** * 土英语:诸葛亮 * * @author linjiabin on 16/5/5 */ public class VariousGeBright implements Think { @Override public String idea() { return "草船借箭"; } }
package top.gabin.oa.web.design.adapter; /** * 补鞋匠 * @author linjiabin on 16/5/5 */ public class Cobbler implements Think { private static int count = 0; @Override public String idea() { if (count > 0 && count % 10 == 0) { return "草船借箭"; } System.out.println("我想不到"); count++; return null; } }
package top.gabin.oa.web.design.adapter; /** * 伪装成聪明人的适配器 * @author linjiabin on 16/5/5 */ public class SmartAdapter extends VariousGeBright { private Cobbler cobbler; public SmartAdapter(Cobbler cobbler) { this.cobbler = cobbler; } @Override public String idea() { String idea = null; while ((idea = cobbler.idea()) == null) { } return idea; } }
package top.gabin.oa.web.design.adapter; import org.junit.Test; /** * 测试适配器的效果 * * @author linjiabin on 16/5/5 */ public class TestAdapter { @Test public void testAdapter() { Cobbler cobbler = new Cobbler(); VariousGeBright variousGeBright = new SmartAdapter(cobbler); String idea = variousGeBright.idea(); System.out.println(idea); } }
输出结果:
我想不到
我想不到
我想不到
我想不到
我想不到
我想不到
我想不到
我想不到
我想不到
我想不到
草船借箭
这个例子是想借鉴三个臭皮匠赛过诸葛亮的寓意,我通过适配器将一个补鞋匠伪装成一个诸葛亮,实际上诸葛亮只需要思考一次就能想到好主意,而补鞋匠需要10次之后才能想到。实际上适配器就是一个伪装面具,当然你也可以把他当做是一种易容术。
外观模式:我们可以把它理解成一个public方法下面调用了好几个private方法。我承认这种语言只有程序员懂,那我们可以换一种方式沟通:这其实有点像宏命令,说白了,其实这是一组命令,而不是一个命令。在生活场景中,我前几天就有遇到一个,刚好跟大家分享一下。我们家有一个空调遥控器,上面只有5、6个按钮,大致是电源、制冷、辅热这样的,我一想,这功能也太少了吧,于是我扒了遥控器,发现里面还有另外一组按钮,只是外层的按钮【比较大】,因为外层按钮包裹了内层的2个按钮。
其实外观模式在类上面相当简单,其目的也仅仅是提供一个高级入口,隐藏子系统接口的调用。
大概是这样子:
---------------------------------
| FacadeInterface |
| -SubSystemInterface |
| -SubSystemInterface |
|------------------------------- |
| +seniorEntrance() |
----------------------------------
SubSystemInterface
seniorEntrance方法调用了私有的SubSystemInterface实现对象的各种方法,但这并不需要告诉你,你只需要只有有这么一个接口就好了。
目的:
适配器的目的是将接口转化为另一个接口的实现
外观模式的目的是简化子系统的调用
常用的方式:
适配器:
适配器实现目标接口,持有待转化实例,实现的目标接口的方法中调用待转化实例的方法
外观模式,通常持有n个子系统实例,提供一个简单的对外接口,实现代码中调用n个子系统实例的具体方法