设计模式 8 —— 适配器模式

设计模式目录:

设计模式 1 ——观察者模式

设计模式 2 —— 装饰者模式 

设计模式 3 —— 迭代器和组合模式(迭代器)

设计模式 4 —— 迭代器和组合模式(组合)

设计模式 5 —— 工厂模式

设计模式 6 —— 单件模式

设计模式 7 —— 命令模式

设计模式 8 —— 适配器和外观模式

设计模式 9 —— 模板方法模式

 

概述

第1 部分 问题引入

第2 部分 实现

第3 部分 定义

第4 部分 对象和类适配器

 

第1 部分 问题引入

OO适配器是什么,现实中到处都是。比方说:如果你需要在欧洲国家使用美国制造的笔记本电脑,你可能需要使用一个交流电的适配器。其实,OO适配器和真实世界的适配器扮演着同样的角色;将一个接口转换成另一个接口,以符合客户的期望。

 

第2 部分 实现

看看使用中的适配器实现:

首先是鸭子接口:

 1 /**
 2  * 鸭子接口
 3  * @ClassName: Duck
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-10-9 下午3:33:04
 7  */
 8 public interface Duck {
 9     
10     public void quack();
11     public void fly();
12 
13 }

 

绿头鸭,鸭子的子类

 1 /**
 2  * 绿头鸭 
 3  * @ClassName: MallardDuck
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-10-9 下午3:38:54
 7  */
 8 public class MallardDuck implements Duck{
 9 
10     @Override
11     public void quack() {
12         System.out.println("Quack");
13     }
14 
15     @Override
16     public void fly() {
17         System.out.println("I'm flying.");
18     }
19 
20 }

 

火鸡:

 1 /**
 2  * 火鸡
 3  * @ClassName: Turkey
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-10-9 下午3:54:37
 7  */
 8 public interface Turkey {
 9     
10     public void gobble();
11     public void fly();
12 
13 }

 

 

 1 /**
 2  * 火鸡的具体实现类
 3  * @ClassName: WildTurkey
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-10-9 下午3:55:23
 7  */
 8 public class WildTurkey implements Turkey{
 9 
10     @Override
11     public void gobble() {
12         System.out.println("Gobble gobble.");
13     }
14 
15     @Override
16     public void fly() {
17         System.out.println("I'm flying a short distance.");
18     }
19 
20 }

 

鸭子的适配器:

 1 /**
 2  * 鸭子适配器
 3  * @ClassName: TurkeyAdapter
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-10-9 下午3:58:12
 7  */
 8 public class TurkeyAdapter implements Duck{
 9     
10     Turkey turkey;
11     
12     public TurkeyAdapter(Turkey turkey){
13         this.turkey = turkey;
14     }
15 
16     @Override
17     public void quack() {
18         turkey.gobble();
19     }
20 
21     @Override
22     public void fly() {
23         for(int i=0;i<5;i++){
24             turkey.fly();
25         }
26         
27     }
28 
29 }

 

测试程序:

 1 /**
 2  * 
 3  * @ClassName: TurkeyTestDrive
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-10-9 下午4:03:21
 7  */
 8 public class TurkeyTestDrive {
 9     public static void main(String[] args){
10         MallardDuck duck = new MallardDuck();
11         WildTurkey turkey = new WildTurkey();
12         
13         Duck turkeyAdapter = new TurkeyAdapter(turkey);
14         System.out.println("The Turkey says...");
15         turkey.gobble();
16         turkey.fly();
17         
18         System.out.println("\nThe Duck says...");
19         testDuck(duck);
20         
21         System.out.println("\nThe TurkeyAdapter says...");
22         testDuck(turkeyAdapter);
23     }
24 
25      static void testDuck(Duck duck) {
26          duck.quack();
27          duck.fly();
28     }
29 
30 }

 

执行结果:

 

第3 部分 定义

适配器模式是将一个类的接口,转换成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间。

这个模式可以通过创建适配器进行接口转换,让不兼容的接口变成兼容。这可以让客户从实现的接口解耦。如果在一段时间以后,我们想要改变接口,适配器可以让改变的部分封装起来,客户就不必为了应对不同的接口而每次跟着改。

 

 适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配器:这种做法还有额外的优点:被适配者的任何子类,都可以搭配着适配器使用。

 

第4 部分 对象和类适配器

实际上有两种适配器:“对象”适配器和“类”适配器。唯一的差别就是在于适配器继承了Target和Adapee。而对象适配器利用组合的方式将请求传送给被适配者。

 

转载于:https://www.cnblogs.com/xingele0917/p/4013913.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值