博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式学习专栏六--------适配器模式
阅读量:7222 次
发布时间:2019-06-29

本文共 2286 字,大约阅读时间需要 7 分钟。

设计模式学习专栏六--------适配器模式

场景


如何让火鸡Turckey冒充鸭子Duck

鸭子接口

public interface Duck {	public void quack();	public void fly();}复制代码

鸭子的实现类--绿头鸭

public class MallardDuck implements Duck {	public void quack() {		System.out.println("Quack");	} 	public void fly() {		System.out.println("I'm flying");	}}复制代码

火鸡接口

public interface Turkey {	public void gobble();	public void fly();}复制代码

火鸡的实现类--野生火鸡

public class WildTurkey implements Turkey {	public void gobble() {		System.out.println("Gobble gobble");	} 	public void fly() {		System.out.println("I'm flying a short distance");	}}复制代码

如何实现

现在,我们缺少鸭子对象,需要用一些火鸡来冒充鸭子,显而易见,因为火鸡的接口不同,所以不能公然拿来使用

  • 创建我们的火鸡适配器

    测试代码

    public class DuckTestDrive {	public static void main(String[] args) {		MallardDuck duck = new MallardDuck();		WildTurkey turkey = new WildTurkey();		Duck turkeyAdapter = new TurkeyAdapter(turkey);		System.out.println("The Turkey says...");		turkey.gobble();		turkey.fly();		System.out.println("\nThe Duck says...");		testDuck(duck);		System.out.println("\nThe TurkeyAdapter says...");		testDuck(turkeyAdapter);	}	static void testDuck(Duck duck) {		duck.quack();		duck.fly();	}}复制代码

    测试结果

    The Turkey says...Gobble gobbleI'm flying a short distanceThe Duck says...QuackI'm flyingThe TurkeyAdapter says...Gobble gobbleI'm flying a short distanceI'm flying a short distanceI'm flying a short distanceI'm flying a short distanceI'm flying a short distance复制代码

客户使用适配器的过程

  • 客户通过目标接口调用适配器的方法对适配器发出请求
  • 适配器使用 被适配者接口 把 请求转换成 被适配者的一个或多个调用接口
  • 客户接收到 调用的结果,但并未察觉这一切是适配器在起转换作用

客户和被适配者是解耦的, 它们互相不知道对方的存在

适配器模式总览


定义:将一个类的接口,转换成客户期望的另一个接口,适配器让原本不兼容的类可以合作无间

  • 类图

  • 模式的理解

    • 角色

      • 目标接口
      • 被适配者
      • 适配器
    • 两种适配器的存在

      • 类适配器

        • 类图

      • 对象适配器

      • 两者的比较

        • 对象适配器使用组合来适配被适配者 , 类适配器使用 继承来适配被适配者
        • 类适配器 有 多重继承的问题
        • 对象适配器能够 切换不同的被适配者 , 在运行中也可以.而类适配器只能采用特定的被适配类
  • 真实世界的迭代器

    • 枚举(Enumeration)和迭代器(Iterator)

      • 类图设计 : 在面对遗留代码中 , 如何让迭代器 代替 枚举器接口?

      • 适配器代码

        public class EnumerationIterator implements Iterator {	Enumeration
        enumeration; public EnumerationIterator(Enumeration
        enumeration) { this.enumeration = enumeration; } public boolean hasNext() { return enumeration.hasMoreElements(); } public Object next() { return enumeration.nextElement(); } public void remove() { throw new UnsupportedOperationException(); }}复制代码

参考

​ 书籍: HeadFirst设计模式

​ 代码参考地址:

转载于:https://juejin.im/post/5c86687651882501351d5116

你可能感兴趣的文章
单链表逆序的几种方法
查看>>
Hardwood Species
查看>>
android 项目中log信息的正确处理
查看>>
C# 定时器运用
查看>>
【转载】NIO客户端序列图
查看>>
Maven单元测试报告及测试覆盖率
查看>>
做开发的目的是为了什么
查看>>
怎样为virtualbox添加新的分辨率
查看>>
HDU 1853Cyclic Tour(网络流之最小费用流)
查看>>
网络通信分享(二):外网ip和内网ip
查看>>
phpstudy2016最新版本mysql无法使用innodb的问题解决
查看>>
手动挡C1驾驶学车@长建驾校
查看>>
git fetch 拉取而不合并
查看>>
Node+Express+node-mysql 实战于演习 全套mysql(增删改查)
查看>>
EHcache经典配置
查看>>
深入解析Java中的装箱和拆箱
查看>>
Power Gating的设计(模块二)
查看>>
Unity3D 之3D游戏角色控制器运动
查看>>
iOS开发--利用MPMoviePlayerViewController播放视频简单实现
查看>>
GetKeyState和GetAsyncKeyState以及GetKeyboardState函数的用法与区别2-------C#检查键盘大小写锁定状态...
查看>>