当前位置: 首页 > news >正文

只能采用某个特定的被适配类 解释

问题

Head First设计模式

“P247提到类适配器只能采用某个特定的被适配类,而对象适配器可以适配该类的任何子类

原因

类适配器

// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类
class Adaptee {
    public void specificRequest() {
        System.out.println("被适配类 具有特殊功能...");
    }
}

// 目标接口,或称为标准接口
interface Target {
    public void request();
}

// 具体目标类,只提供普通功能
class ConcreteTarget implements Target {
    public void request() {
        System.out.println("普通类 具有普通功能...");
    }
}

// 适配器类,继承了被适配类,同时实现标准接口
class Adapter extends Adaptee implements Target{
    public void request() {
        super.specificRequest();
    }
}

// 测试类
public class Client {
    public static void main(String[] args) {
        // 使用普通功能类
        Target concreteTarget = new ConcreteTarget();//实例化一个普通类
        concreteTarget.request();

        // 使用特殊功能类,即适配类
        Target adapter = new Adapter();
        adapter.request();
    }
}

可以看到在适配器类Adapter中是通过super.specificRequest()来调用被适配类Adaptee的。

如果被适配类Adaptee有一个子类AdapteeChild,这种情况下是无法直接适配子类的,必须修改适配器类Adapter让它继承AdapteeChild这个子类。

对象适配器

// 适配器类,直接关联被适配类,同时实现标准接口
class Adapter implements Target{
    // 直接关联被适配类
    private Adaptee adaptee;

    // 可以通过构造函数传入具体需要适配的被适配类对象
    public Adapter (Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    public void request() {
        // 这里是使用委托的方式完成特殊功能
        this.adaptee.specificRequest();
    }
}

// 测试类
public class Client {
    public static void main(String[] args) {
        // 使用普通功能类
        Target concreteTarget = new ConcreteTarget();
        concreteTarget.request();

        // 使用特殊功能类,即适配类,
        // 需要先创建一个被适配类的对象作为参数
        Target adapter = new Adapter(new Adaptee());
        adapter.request();
    }
}

而对象适配器采用组合的方式,

如果被适配类Adaptee有一个子类AdapteeChild

public class AdapteeChild extends Adaptee {
    public void specificRequest() {
        System.out.println("被适配子类 具有特殊功能...");
    }
}

那么可以直接修改Client.class文件:

        Target adapter = new Adapter(new AdapteeChild());
        adapter.request();

无需修改Adapter.class即可调用这个被适配类的子类


代码来源于:适配器模式之类适配器与对象适配器的区别及代码实现_ai-exception的博客-CSDN博客_类适配器和对象适配器

相关文章:

  • Shenandoah收集器三个并发阶段工作过程图
  • 易语言显示js时间格式
  • Cannot resolve MVC view
  • ZooKeeper安装和配置 for Mac
  • ContextLoaderListener的作用是什么
  • idea run anything快捷键
  • @Autowired多个相同类型bean装配问题
  • 大话数据结构中kmp算法看不懂的正确姿势
  • 图解http xss攻击url中加号+问题
  • 如何理解停机问题
  • java核心技术卷1 2 英文版pdf/epub+源代码 Core Java, 11th Edition
  • Files.readAllBytes() 方法
  • 查看mysql版本
  • cmd命令行设置绿色字体 透明度
  • distinct 不能用于count(*) 的原因
  • Bootstrap JS插件Alert源码分析
  • css的样式优先级
  • express + mock 让前后台并行开发
  • LeetCode算法系列_0891_子序列宽度之和
  • Linux各目录及每个目录的详细介绍
  • Python3爬取英雄联盟英雄皮肤大图
  • Python学习之路16-使用API
  • ViewService——一种保证客户端与服务端同步的方法
  • VuePress 静态网站生成
  • 对超线程几个不同角度的解释
  • 高性能JavaScript阅读简记(三)
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 前端相关框架总和
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 微信支付JSAPI,实测!终极方案
  • 项目管理碎碎念系列之一:干系人管理
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (14)Hive调优——合并小文件
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • ***利用Ms05002溢出找“肉鸡
  • .FileZilla的使用和主动模式被动模式介绍
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CLR基本术语
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net 设置默认首页
  • .NET6实现破解Modbus poll点表配置文件
  • .NetCore项目nginx发布
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @property python知乎_Python3基础之:property
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [383] 赎金信 js
  • [BZOJ1178][Apio2009]CONVENTION会议中心
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)