• Head First设计模式(阅读笔记)-07.适配器模式


    火鸡冒充鸭子

    现在缺少一个绿头鸭对象,需要用野生火鸡对象冒充一下,但是二者的接口都不一样该怎么去冒充呢?


    // 鸭子接口
    public interface Duck{
    	public void quack();  // 呱呱叫
        public void fly();  // 飞行
    }
    // 火鸡接口
    public interface Turkey{
        public void gobble();  // 咯咯叫
        public void fly();  // 飞行
    }
    // 野生火鸡
    public class WildTurkey implements Turkey{
    	public void gobble(){
        	System.out.println("gobble");
        }
        public void fly(){
        	System.out.println("short flying"); 
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    写个适配器

    public class TurkeyAdapter implements Duck{  // 实现目标接口(因为想要一个鸭子对象,所以要实现Duck接口)
        Turkey turkey;  // 火鸡就是被适配的接口,使用组合的方式
        public TurkeyAdapter(Turkey turkey){  // 获取到被适配的对象引用
            this.turkey = turkey;
        }
        public void quack(){
            turkey.gobble();  // 暂且用火鸡的叫声冒充一下鸭子的叫声
        }
        public void fly(){
            for(int i = 0; i < 5; i++){
                turkey.fly();  // 鸭子能飞挺久,火鸡飞的时间短就多飞几次
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    测试适配器

    public class DuckTest{
        public static void main(String[] args){
            WildTurkey turkey = new WildTurkey();
            Duck turkeyAdapter = new TurkeyAdapter(turkey);  // 开始冒充
            // 还是和鸭子一样能调用相应的方法,冒充成功
            turkeyAdapter.quack();
            turkeyAdapter.fly();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    适配器模式

    • 适配器模式将一个类的接口转换为客户期望的另一个接口,也就让原本接口不兼容的类可以合作
    • 将适配器模式类推到上述火鸡鸭子例子,如下图所示:

    在这里插入图片描述

    • 客户使用适配器的流程:
      • 客户通过目标接口调用适配器的方法
      • 适配器使用被适配者接口把请求转换为被适配者的一/多个接口
      • 客户接收到调用结果时并不知道适配器进行了转换
      • 客户和被适配者是解耦的,它们之间并不知道对方

    在这里插入图片描述


    从枚举适配到迭代器

    在早期的Java集合类型中存在一个Enumeration接口,其中有hashMoreElementsnextElement方法,而在更新后的Java集合类中开始使用Iterator接口,其中的方法是hashNextnextremove,现在希望在新代码中只使用迭代器,该如何实现?


    设计适配器

    public class EnumerationIterator implements Iterator{  // Iterator是目标接口
        Enumeration enum;  // Enumeration就是被适配的接口,使用组合的方式
        public EnumerationIterator(Enumeration enum){
            this.enum = enum;
        }
        public boolean hasNext(){  // 委托给enum的hashMoreElements方法
            return enum.hashMoreElements();
        }
        public Object next(){
            return enum.nextElement();  // 同理
        }
        public void remove(){
            return new UnsupportedOperationException();  // 无法支持,只能抛个异常
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    参考

    Head First 设计模式-适配器模式

    设计模式-适配器模式

  • 相关阅读:
    java-net-php-python-jsp网络考试系统计算机毕业设计程序
    C++中数组和指针的类似之处
    湘潭大学数据库实验二
    Ubuntu 18.04安装fast-dds
    【深度学习】关于处理过拟合的一点心得
    二维码智慧门牌管理系统升级:深入了解5种数据权限
    2023北京市人工智能大模型场景融合与产业发展专场活动盛大召开
    计算机毕业设计Java居民个人健康信息与个人健康服务综合平台(源码+mysql数据库+系统+lw文档)
    round函数四舍五入结果不对
    数据银行:安全保障的重要一环
  • 原文地址:https://blog.csdn.net/qq_41398418/article/details/128111192