适配器模式
来源:互联网 发布:dive into python 2 编辑:程序博客网 时间:2024/06/05 06:41
适配器模式将一个类的接口,转换成客户期望的另一个接口。适配让原本接口不兼容的类可以合作无间。
类图
java代码
// 鸭子接口public interface Duck { void quack(); // 呱呱叫 void fly();}// 绿头鸭public class MallardDuck implements Duck { @Override public void quack() { System.out.println("quack ~~~"); } @Override public void fly() { System.out.println("fly ~~~"); }}// 火鸡接口public interface Turkey { void gobble(); // 咯咯叫 void flyShortDistance();}// 野火鸡public class WildTurkey implements Turkey { @Override public void gobble() { System.out.println("gobble ~~~"); } @Override public void flyShortDistance() { System.out.println("fly short distance ~~~"); }}// 装饰器,将火鸡伪装成一只鸭子public class TurkeyAdapter implements Duck { private Turkey turkey; public TurkeyAdapter(Turkey turkey) { this.turkey = turkey; } @Override public void quack() { turkey.gobble(); } @Override public void fly() { for (int i = 0; i < 5; i++) { // 火鸡飞的距离比较短,我们让他飞5次,这样看起来更像是一只鸭子 turkey.flyShortDistance(); } }}// 测试类public class Test { public static void main(String[] args) { new Test().test(); } private void test() { // 火鸡 Turkey wildTurkey = new WildTurkey(); wildTurkey.gobble(); wildTurkey.flyShortDistance(); // 鸭子 Duck mallardDuck = new MallardDuck(); testDuck(mallardDuck); // 伪装成鸭子的火鸡 Duck duck = new TurkeyAdapter(wildTurkey); testDuck(duck); } private void testDuck(Duck duck) { duck.quack(); duck.fly(); }}
注:
- 现在我们可以把火鸡当成鸭子用了。。。
- 适配器模式需要区别于外观模式(可参考我的另一篇文章),两者目的不同
适配器模式:伪装接口符合客户的期望
外观模式:提供子系统的一个简化接口
类适配器
适配器有两种模式,上面示例属于对象适配器。我们通过实现Duck接口,组合WildTurkey类创建了一个适配器。
还有一种是类适配器。我们可以通过继承Turkey和Duck类来创建适配器,Turkey和Duck是具体类,不再是接口。恨遗憾java不支持多重继承,所以无法演示。
参考文章
1. Head First 设计模式
0 0
- 适配器及适配器模式
- 适配器及适配器模式
- 适配器模式(类适配器)
- 适配器模式(默认适配器)
- 适配器模式(对象适配器)
- 适配器模式-类适配器
- 适配器模式-对象适配器
- 适配器模式
- 适配器模式
- 适配器模式
- 适配器模式
- 适配器模式
- 适配器模式
- 适配器模式
- 适配器模式
- 适配器模式
- 适配器模式
- 适配器模式
- 我的博客
- 字符移位 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。 你能帮帮小Q吗? 输入描述: 输入数据有多组
- 数据结构系列(三)链表
- SQLserver 中的日期函数--DATEDIFF()、GETDATE() 、DATEADD() 、DATEPART()
- 数字和方法数
- 适配器模式
- 浅谈JavaScript模拟$(HTML字符串)实现创建DOM对象
- "Restarting data prefetching from start" repeated many times one by one. why?
- swustoj前缀字符串(0185)
- intellij idea svn使用一 导入、更新、提交、解决冲突
- 让输入焦点移动到下一个编辑框
- 2015百度
- VS2013配置VTK7.1.1
- 通过axis2将wdsl文件导出java文件