java设计模式之适配器模式

适配器模式概述
        众所周知,我们国家的生活用电的电压是220V,而笔记本电脑、手机等电子设备的工作电压没有这么高,为了使笔记本、手机等设备可以使用220V的生活用电,就需要使用电源适配器(ACAdapter),也就是人们常说的充电器或变压器,有了这个电源适配器,原本不能直接工作的生活用电和笔记本电脑就可以兼容了。在这里电源适配器充当了一个适配器的角色
在软件开发中有时也存在类似这种不兼容的情况,也可以像引人一个电源适配器那样引入一个称为适配器的角色来协调这些存在不兼容的结构,这种设计方案即为适配器模式。

        适配器模式结构与实现
适配器模式包括类适配器和对象适配器。在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。下面分别分析这两种适配器的结构。

课后习题:

1.使用Java语言实现一个双向适配器实例,使得猫(Cat)可以学狗(Dog)叫(cry()),狗可以学猫抓老鼠(catchMouse())。绘制相应类图并编程模拟实现。

package designpatterns.builder;

public class Adapter implements Dog,Cat{
    private Cat cat;
    private Dog dog;
    public Cat getCat() {
        return cat;
    }
    public void setCat(Cat cat) {
        this.cat = cat;
    }
    public Dog getDog() {
        return dog;
    }
    public void setDog(Dog dog) {
        this.dog = dog;
    }
    @Override
    public void cry() //猫学狗叫
    {
        System.out.print( "猫学");
        dog.wang();
    }
    @Override
    public void catchMouse() {
        cat.catchMouse();
    }
    @Override
    public void wang() {
        dog.wang();
    }
    @Override
    public void action() //狗学猫抓老鼠
    {
        System.out.print( "狗学");
        cat.catchMouse();
    }
}
package designpatterns.builder;
public interface Cat {
    void cry();
    void catchMouse();
}
package designpatterns.builder;

public class ConcreteCat implements Cat{
    @Override
    public void cry() {
        System.out.println("猫叫");
    }
    @Override
    public void catchMouse() {
        System.out.println("猫抓老鼠");
    }
}


package designpatterns.builder;

public class ConcreteDog implements Dog{
    @Override
    public void action() {
        System.out.println("狗叫");
    }
    @Override
    public void wang() {
        System.out.println("狗叫");
    }
}
package designpatterns.builder;

public interface Dog {
    void action();
    void wang();
}
package designpatterns.builder;

public class Test {
    public static void main(String args[])
    {
        Cat cat1 = new ConcreteCat();
        Dog dog1 = new ConcreteDog();
        Adapter A1 = new Adapter();
        A1.setCat(cat1);
        A1.setDog(dog1);
        cat1 = (Cat) A1;
        cat1.catchMouse();
        cat1.cry();
        dog1 = (Dog) A1;
        dog1.action();
    }
}

2.Windows Media Player和RealPlayer是两种常用的媒体播放器,它们的API结构和调用方法存在区别。现在你的应用程序需要支持这两种播放器AP,而且在将来可能还需要支持新的媒体播放器,请问如何设计该应用程序?

在该类图中,我们为两种不同的播放器提供了两个具体工厂类MediaPlayerFactoy和RealPlayerFactory,其中MediaPlayerFactory作为Windows Media Plaver懂放器工厂,可以创建Windows Media Plaver的主窗 (MediaPlayerWindow)和播放列表MediaPlayerlist)(为了简化类图,只列出主窗口和播放列表文两个播放器组成元素,实际情况下包含更多成元素): ReaPlaverFactov作为ReaPlaer播放器工创建RealPlaver的主窗口RealPlaverWindow和播放列表RealPlaverList),此时可以使用抽象工厂模式,客户端针对抽象工广PlayerFactorv程,如果增加新的播放器,只需增加一个新的具体工厂来生产新产品族中的产品即可。由于需要调用现有API中的方法,因此还需要使用活面器模式,在具体产品类如MediaPlaverWindow和MediaPlayerList周用Windows Media PlayerAPI中的万法,在RealPlayerWindow和ReaPlaverList中调用RealPlaver API中的方法,实现对API中方法的适配,此时具体产品如MediaPlaverWindow、RealPlaverWindon等充当适配器,而已有的API如MediaPlayerAPI和RealPlayerAPI是需要适配的适配者。


3.某OA系统需要提供一个加密模块,将用户机密信息(例如口令、邮箱等)加密之后存储在数据库中,系统已经定义好了数据库操作类。为了提高开发效率,现需要重用已有的加密算法,这些算法封装在一些由第三方提供的类中,有些甚至没有源代码。试使用适配器模式设计该加密模块,实现在不修改现有类的基础上重用第三方加密方法。要求绘制相应的类图并使用Java语言编程模拟实现,需提供对象适配器和类适配器两套实现方案

package designpatterns.bridge;
public class Client {
    public static void main(String[] args) {
        Encode encode=new Adapter(new Adaptee());
        String result=encode.encodePwd("hello");
        System.out.println(result);
    }
}
package designpatterns.bridge;

public interface Encode {
    String encodePwd(String password);
}
package designpatterns.bridge;

public class Adaptee {
    public String encodeAPI(String password){
        return password.toUpperCase();
    }
}
package designpatterns.bridge;

public class Adapter implements Encode{
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public String encodePwd(String password) {
        return adaptee.encodeAPI(password);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/493888.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024室内设计和建筑必须知道的十大3D渲染趋势!

2023年对建筑圈是非常不平凡的一年,高清视频渲染、元宇宙全覆盖、AI模型大爆发.....不断发展的 3D 数字技术世界正迅速重塑建筑设计行业。 2024年,室内设计和建筑设计领域在3D渲染方面又将迎来怎样的变革?以下十大3D渲染趋势,你不…

代码随想录——搜索插入位置(Leetcode35)

题目链接 class Solution {public int searchInsert(int[] nums, int target) {int len nums.length;int left 0;int right len - 1;int index -1;while(left < len / 2){if(nums[left] target || target < nums[left]){index left;break;}else{left;}if(nums[ri…

详解 WebWorker 的概念、使用场景、示例

前言 提到 WebWorker&#xff0c;可能有些小伙伴比较陌生&#xff0c;不知道是做什么的&#xff0c;甚至不知道使用场景&#xff0c;今天这篇文章就带大家一起简单了解一下什么是 webworker&#xff01; 概念 WebWorker 实际上是运行在浏览器后台的一个单独的线程&#xff0…

opengl草稿复习,承上启下

目录 1、链接文件夹中的cpp 2、链接资源到输出目录 3、多编译目标 4、cmakelist添加库 4、添加glfw和glad 5、glfw运行 6、NDC、VBO、VAO 7、渐变三角形 8、渲染两个三角形 9、渲染两个三角形&#xff0c;同时基于原来颜色进行渐变 1、链接文件夹中的cpp cmake_minimu…

跨站脚本攻击

跨站脚本攻击又称XSS攻击&#xff0c;是代码注入攻击的一种。利用XSS漏洞&#xff0c;攻击者可以窃取Cookies或劫持会话&#xff0c;或注入恶意 HTML 或 JavaScript 代码到页面中&#xff0c;又或者将当前页面重定向至一个攻击者搭建的恶意网站。XSS漏洞的产生多是因为网站开发…

Java 枚举(概念+枚举的使用+源码分析)

文章目录 一、枚举1.概念2.使用1.switch语句2.Enum类中的方法3.枚举无法反射 一、枚举 1.概念 将一组常量组织到一起&#xff0c;统一进行管理避免了定义常量时&#xff0c;可能发生的歧义枚举更加安全枚举不可继承&#xff0c;无法扩展 public enum TestEnum {//枚举对象&am…

第四届数字信号与计算机通信国际学术会议(DSCC 2024)

#高录用&#xff0c;稳检索# #高校背书&#xff0c;更可靠# DSCC 2024已通过SPIE出版社审核&#xff0c;ISSN号已确定&#xff1a;ISSN: 0277-786X&#xff0c;往届均已见刊EI检索&#xff01; 第四届数字信号与计算机通信国际学术会议&#xff08;DSCC 2024&#xff09; 2024 …

ROS 2边学边练(2)-- 咱也玩玩Turtlesim

同ROS 1一样&#xff0c;Turtlesim(小海龟)例程往往是大家首次熟悉ROS世界的唯一不二之选&#xff08;如同刚接触编程的同学&#xff0c;老师会让大家打出“Hello World”的道理一样&#xff09;&#xff0c;很多教学视频及书籍也同样如此&#xff0c;为何&#xff1f;麻雀虽小…

跨境必看的TikTok养号保姆式教程

TikTok养号的重要性不必多少&#xff0c;不仅可以在创号初期保障账号安全&#xff0c;后期的账号流量也需要以前期养好账号为前提。下面就给大家分享如何养号的真实操作攻略&#xff01; 一、为什么要养号 &#xff08;1&#xff09;提高系统推荐精准度 系统不了解新账户人设…

LangChain核心概念与组件

Chains Chains可以让你按照一定的顺序和逻辑来执行不同的任务。Chains有以下四种类型&#xff1a; 类型作用LLMChain用于在语言模型周围添加一些功能的简单Chain&#xff0c;它由一个PromptTemplate和一个语言模型&#xff08;LLM或chat model&#xff09;组成&#xff0c;它…

初识C++(二)引用,内联函数,auto

目录 1.引用的概念与用法&#xff1a; 1.1引用特性&#xff1a; 1.2使用场景 1.2.1做参数 1.3传值、传引用效率比较 1.4引用做返回值 1.5引用和指针的对比 2.内联函数 3.auto关键字 4. 基于范围的for循环(C11) 5.指针空值nullptr(C11) 1.引用的概念与用法&#xff1a;…

记录 AI绘图 Stable Diffusion的本地安装使用,可搭建画图服务端

开头 最近刷短视频看到了很多关于AI绘图&#xff0c;Midjourney&#xff0c;gittimg.ai&#xff0c;Stable Diffusion等一些绘图AI工具&#xff0c;感受到了AI绘画的魅力。通过chatGPT生成关键词再加上绘图工具&#xff0c;真是完美&#xff0c;文末教大家如何用gpt提词 Midj…

浮动布局与定位布局

目录 前言: 浮动布局&#xff08;Float Layout&#xff09;: 定位布局&#xff08;Positioning Layout&#xff09;: 1.传统布局: 1.1文档流布局: 1.1.1基本的布局方式: 1.1.2 块级元素: 1.1.3调整元素: 1.2浮动布局: 1.2.1浮动布局允许元素向左或向右浮动&#xff0c;使…

docker启动卡死问题排查

问题&#xff1a;输入docker ps 或则vession 卡死&#xff0c;无任何输出 排查思路如下&#xff1a; 1、查看docker状态或者日志 journalctl -u docker.service 或者 systemctl status docker 3月 20 18:23:06 dfbpmyy2 dockerd[1114]: time"2024-03-20T18:23:06.7449…

SpringBoot整合Redis:缓存击穿--互斥锁解决

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏Redis实战与进阶 本专栏讲解Redis从原理到实践 …

Python算法100例-4.5 最小公倍数

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序 1&#xff0e;问题描述 求任意两个正整数的最小公倍数&#xff08;Least Common Multiple&#xff0c;LCM&#xff09;。 2&#xff0e;问题分析 如…

开源博客项目Blog .NET Core源码学习(12:App.Application项目结构分析)

开源博客项目Blog的App.Application项目主要定义网站页面使用的数据类&#xff0c;同时定义各类数据的增删改查操作接口和实现类。App.Application项目未安装Nuget包&#xff0c;主要引用App.Core项目的类型。   App.Application项目的顶层文件夹如下图所示&#xff0c;下面逐…

【Java程序设计】【C00352】基于Springboot的疫情隔壁酒店管理系统(有论文)

基于Springboot的疫情隔壁酒店管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以…

大学里女生适合做什么副业?这几个小副业最适合女生

大学里女生应该做什么样的副业合适&#xff1f;对于这个问题没办法给大家确定的答案&#xff0c;毕竟每个人能做什么&#xff0c;适合什么&#xff0c;要根据每个人的性格特点特长来看。 但是女生们不管做什么&#xff0c;尽量都不要选择做廉价劳动力的赚钱方式&#xff0c;因为…

STM32串口收发单字节数据原理及程序实现

线路连接&#xff1a; 显示屏的SCA接在B11&#xff0c;SCL接在B10&#xff0c;串口的RX连接A9&#xff0c;TX连接A10。 程序编写&#xff1a; 在上一个博客中实现了串口的发送代码&#xff0c;这里实现串口的接收代码&#xff0c;在上一个代码的基础上增加程序功能。 Seiral.…