设计模式总结:适配器、桥接、组合和迭代器模式

在之前的对话中,我们讨论了五种常见的 Java 设计模式:单例、工厂、策略、装饰器和观察者模式。现在,让我们继续探索其他四种设计模式:适配器、桥接、组合和迭代器模式。

适配器模式

概念:
适配器模式是一种结构型设计模式,用于将一个类的接口转换为另一个类期望的接口。适配器模式可以让原本由于接口不兼容而不能一起工作的类可以进行交互。

使用场景:

  • 当你需要将一个类的接口转换为另一个类期望的接口时。
  • 当你想要重用一些现有的类,但是这些类的接口与你需要的接口不兼容时。

优点:

  • 提供了一种简单的方法来使不兼容的接口协同工作。
  • 可以避免修改现有的代码,从而降低了修改引入的风险。

缺点:

  • 如果接口的差异过大,可能会导致适配器类变得复杂。
  • 过度使用适配器模式可能会使得系统的结构变得混乱。

使用注意事项:

  • 确保适配器类正确地转换接口。
  • 考虑使用其他设计模式(如桥接模式)来解决接口不兼容的问题。

代码示例:

// Target interface
public interface Volt3 {public void getVolt();
}// Adaptee class
public class Volt220 {public void get220Volt() {System.out.println("220 volts");}
}// Adapter class
public class VoltAdapter implements Volt3 {private Volt220 volt220;public VoltAdapter(Volt220 volt220) {this.volt220 = volt220;}@Overridepublic void getVolt() {volt220.get220Volt();}
}// Usage
public class Main {public static void main(String[] args) {Volt220 volt220 = new Volt220();Volt3 volt3 = new VoltAdapter(volt220);volt3.getVolt();}
}
桥接模式

概念:
桥接模式是一种结构型设计模式,用于将抽象部分与实现部分分离,使它们可以独立变化。桥接模式可以在运行时选择或切换实现。

使用场景:

  • 当你需要在运行时选择或切换实现时。
  • 当你想要避免使用继承来扩展功能时。

优点:

  • 提供了一种灵活的方式来扩展功能,而不需要修改原有代码。
  • 可以将抽象部分和实现部分分离,从而降低了系统的复杂度。

缺点:

  • 如果桥接的接口过于复杂,可能会使得系统的复杂度增加。
  • 在某些情况下,桥接模式可能会导致性能问题。

使用注意事项:

  • 确保抽象类和实现类都有清晰的定义和职责。
  • 在设计桥接模式时,需要权衡其带来的灵活性和系统复杂度的增加。

代码示例:

// Abstraction
public abstract class Shape {protected DrawAPI drawAPI;protected Shape(DrawAPI drawAPI){this.drawAPI = drawAPI;}public abstract void draw();
}// Refined Abstraction
public class Circle extends Shape {private int x, y, radius;public Circle(int x, int y, int radius, DrawAPI drawAPI) {super(drawAPI);this.x = x;this.y = y;this.radius = radius;}@Overridepublic void draw() {drawAPI.drawCircle(x, y, radius);}
}// Implementor
public interface DrawAPI {void drawCircle(int x, int y, int radius);
}// Concrete Implementor
public class DrawAPI1 implements DrawAPI {@Overridepublic void drawCircle(int x, int y, int radius) {System.out.println("Drawing circle using DrawAPI1");}
}// Concrete Implementor
public class DrawAPI2 implements DrawAPI {@Overridepublic void drawCircle(int x, int y, int radius) {System.out.println("Drawing circle using DrawAPI2");}
}// Usage
public class Main {public static void main(String[] args) {Shape circle1 = new Circle(1, 2, 3, new DrawAPI1());Shape circle2 = new Circle(5, 6, 7, new DrawAPI2());circle1.draw();circle2.draw();}
}
组合模式

概念:
组合模式是一种结构型设计模式,用于表示部分-整体层次结构。组合模式让你可以将对象组合成树形结构来表示部分-整体的层次关系。

使用场景:

  • 当你需要表示部分-整体层次结构时。
  • 当你想要让客户端可以统一地处理单个对象和对象集合时。

优点:

  • 提供了一种简单的方式来构建复杂的对象结构。
  • 可以使得客户端代码更加简洁和易于维护。

缺点:

  • 如果组合层次过深,可能会使得系统的复杂度增加。
  • 在某些情况下,组合模式可能会导致性能问题。

使用注意事项:

  • 确保组合对象和叶子对象都实现了相同的接口。
  • 在设计组合模式时,需要考虑如何处理添加或删除子元素的操作。

代码示例:

// Component
public interface Component {void operation();
}// Leaf
public class Leaf implements Component {private String name;public Leaf(String name) {this.name = name;}@Overridepublic void operation() {System.out.println("Leaf " + name + " is doing something");}
}// Composite
public class Composite implements Component {private List<Component> children = new ArrayList<>();public void add(Component component) {children.add(component);}public void remove(Component component) {children.remove(component);}@Overridepublic void operation() {for (Component component : children) {component.operation();}}
}// Usage
public class Main {public static void main(String[] args) {Composite composite1 = new Composite();Composite composite2 = new Composite();Leaf leaf1 = new Leaf("Leaf 1");Leaf leaf2 = new Leaf("Leaf 2");Leaf leaf3 = new Leaf("Leaf 3");composite1.add(leaf1);composite1.add(leaf2);composite2.add(leaf3);composite2.add(composite1);composite2.operation();}
}
迭代器模式

概念:
迭代器模式是一种行为型设计模式,用于遍历集合对象。迭代器模式可以隐藏集合对象的内部实现细节。

使用场景:

  • 当你需要遍历一个集合对象时。
  • 当你想要隐藏集合对象的内部实现细节时。

优点:

  • 提供了一种统一的方式来访问集合对象中的元素。
  • 可以使得集合对象的实现细节对外部世界隐藏。

缺点:

  • 如果迭代器的实现过于复杂,可能会使得系统的复杂度增加。
  • 在某些情况下,迭代器模式可能会导致性能问题。

使用注意事项:

  • 确保迭代器对象正确地遍历集合对象。
  • 在设计迭代器模式时,需要考虑如何处理集合对象的修改操作。

代码示例:

// Iterator
public interface Iterator {boolean hasNext();Object next();
}// Aggregate
public interface Aggregate {Iterator createIterator();
}// Concrete Aggregate
public class ConcreteAggregate implements Aggregate {private List<Object> list = new ArrayList<>();public void add(Object object) {list.add(object);}public void remove(Object object) {list.remove(object);}@Overridepublic Iterator createIterator() {return new ConcreteIterator(this);}
}// Concrete Iterator
public class ConcreteIterator implements Iterator {private ConcreteAggregate aggregate;private int index = 0;public ConcreteIterator(ConcreteAggregate aggregate) {this.aggregate = aggregate;}@Overridepublic boolean hasNext() {return index < aggregate.list.size();}@Overridepublic Object next() {Object object = aggregate.list.get(index);index++;return object;}
}// Usage
public class Main {public static void main(String[] args) {ConcreteAggregate aggregate = new ConcreteAggregate();aggregate.add("Item 1");aggregate.add("Item 2");aggregate.add("Item 3");Iterator iterator = aggregate.createIterator();while (iterator.hasNext()) {Object item = iterator.next();System.out.println(item);}}
}

这个示例演示了如何使用迭代器模式来遍历一个集合对象(在本例中是一个列表)。ConcreteAggregate类是具体的聚合对象,它实现了Aggregate接口并提供了一个createIterator()方法来返回一个迭代器对象。ConcreteIterator类是具体的迭代器对象,它实现了Iterator接口并提供了hasNext()next()方法来遍历聚合对象中的元素。最后,在Main类中,我们创建了一个ConcreteAggregate对象,添加了一些元素,然后使用迭代器对象来遍历并打印每个元素。

以上就是适配器、桥接、组合和迭代器模式的简要介绍。这些设计模式在解决特定类型的问题时都有其独特的优势和适用场景。掌握这些模式可以帮助我们编写更灵活、更可维护和更可扩展的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UART编程框架详解

1. UART介绍 UART&#xff1a;通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;简称串口。 调试&#xff1a;移植u-boot、内核时&#xff0c;主要使用串口查看打印信息 外接各种模块 1.1 硬件知识_UART硬件介绍 UART的全称是Unive…

新160个crackme - 011-wocy.1

运行分析 显示Unregister&#xff0c;点击注册无反应&#xff0c;猜测要先注册 PE分析 C 程序&#xff0c;32位&#xff0c;无壳 静态分析 ida发现关键字符串&#xff0c;进入关键函数 动态调试 设置断点动态调试&#xff0c;CWnd::UpdateData(true) &#xff1a;用于将屏幕上控…

C#中压缩文件夹,及其内容

压缩包格式&#xff0c;本文主要用于说明如何使用代码 文件或文件夹压缩为 zip压缩包及其解压操作&#xff0c; 下面分两个版本进行实现 1.简单版本 bool DoCompressDirectoryInfo(string folderPath){try{var zipFilePath $"{folderPath}.zip";var directoryInfo …

形态学分析

在 OpenCV 中&#xff0c;形态学&#xff08;Morphology&#xff09;是一种图像处理技术&#xff0c;主要用于处理图像中的形状和结构。形态学操作基于图像形状的形态学特征&#xff0c;如点、线、曲线等&#xff0c;而不是像素值。形态学操作通常用于图像预处理、分割、边缘检…

MATLAB基础:数据和变量

今天我们开始学习MATLAB基础知识 1、常用非运算符及其作用 1、“,” 作为程序运行的分隔符&#xff0c;起到分隔语句的作用 2、“;” 同样作为分隔符&#xff0c;与“,”不同的是“;”会在程序运行时隐藏该行语句 如下图&#xff1a; 3、“...” 三个英文句点表示续行符…

djiango-开始创建一个应用

pycharm查看djiango版本&#xff1a; django-admin --version 创建djiango项目 new project创建或者 django-admin startproject django_project cd django_project 文件作用&#xff1a; django_project ├──django_project // 项目全局文件目录 │ ├─…

ros2--launch--xml定义

定义规范 官网 node的属性 type ros2没有这个type属性。

W30-python03-pytest+selenium+allure访问百度网站实例

此篇文章为总结性&#xff0c;将pystest、selenium、allure结合起来 功能如下&#xff0c;web自动化&#xff0c;输入baidu网站&#xff0c;搜索“雷军”、打开网页中第一条内容 pytestsel.py如下&#xff1a; import time import re import allure import pytest from tools…

提升ROI:利用高级爬虫技术优化营销策略

如何通过高级爬虫技术高效提升营销ROI&#xff1f; 摘要&#xff1a; 在当今数据驱动的营销环境中&#xff0c;提升投资回报率&#xff08;ROI&#xff09;的关键在于精准洞察市场与用户行为。本文将探讨如何运用高级爬虫技术来优化营销策略&#xff0c;从海量互联网数据中挖掘…

C++ 《类与对象》(中下)

C 《类与对象》&#xff08;下&#xff09; 赋值运算符重运算符定义 取地址运算符重载const成员函数 初始化列表格式练习 类型转换结束&#xff01;&#xff01;&#xff01;&#xff01; 赋值运算符重 • 当运算符被⽤于类类型的对象时&#xff0c;C语⾔允许我们通过运算符重载…

立元科技-Java面经

面试时间&#xff1a;2024年2月13日 面试地点&#xff1a;线下 面试流程&#xff1a;一轮面试 首先写了点笔试题&#xff0c;但是人家根本不看&#xff08;这个也就一面&#xff09; &#xff08;聊的还行&#xff0c;但是公司环境不是特别的好&#xff0c;一次面试&#x…

挖掘IPython的深度:%%dhist命令的历史探索之旅

挖掘IPython的深度&#xff1a;%%dhist命令的历史探索之旅 IPython&#xff0c;作为一款强大的交互式Python解释器&#xff0c;不仅提供了丰富的功能来增强Python编程体验&#xff0c;还允许用户轻松地回顾和利用历史命令。%%dhist命令是IPython中一个非常实用的魔术命令&…

【数据分享】2008-2022年我国省市县三级的逐日NO2数据(excel\shp格式)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000-2022年的省市县三级的逐日PM2.5数据、2013-2022年的省市县三级的逐日CO数据和2013-2022年的省市县三级的逐日SO2数据&#xff08;均可查看之前的文章获悉详情&#xff09;&#xff01; 本次…

CrossEntropyLoss交叉熵损失函数的使用

目录 CrossEntropyLoss交叉熵损失函数的使用&#xff1a; 一、官方说明&#xff1a; 二、两种使用情况&#xff1a; 1&#xff09;情况一&#xff1a;target是一个类索引&#xff08;Example of target with class indices&#xff09; 2&#xff09;情况二&#xff1a;tar…

LeeCode Practice Journal | Day23_Backtracking

39.组合总和 题目&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a;代码随想录 (programmercarl.com) 不同要求下的组合&#xff0c;可以进行一下总结 solution public class Solution {public List<IList<int>> results new…

Postman API测试数据生成秘籍:技巧与实践

Postman API测试数据生成秘籍&#xff1a;技巧与实践 在API测试过程中&#xff0c;生成合适的测试数据是确保测试覆盖率和准确性的关键步骤。Postman作为流行的API开发和测试工具&#xff0c;提供了多种方法来生成和管理测试数据。本文将深入探讨Postman中API测试数据生成的技…

jmeter实战(1)- Mac环境安装

一、安装 JDK 这个就不介绍了&#xff0c;本地自行安装 JDK 并且配置好环境变量 二、安装 Jmeter 1. 下载地址 —> 下载链接点击这里 2. 选择合适的版本下载 3. 解压到本地目录 解压后&#xff0c;会得到下面的目录文件&#xff1a; 输入cd bin&#xff0c;进入到bin…

Java中的多级缓存设计与实现

Java中的多级缓存设计与实现 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代应用程序中&#xff0c;多级缓存设计是一种常见的性能优化技术。多级缓存通过在不同层次上缓存数据来减少对底层存…

[STM32]HAL库实现自己的BootLoader-BootLoader与OTA-STM32CUBEMX

目录 一、前言 二、BootLoader 三、BootLoader的实现 四、APP程序 五、效果展示 六、拓展 一、前言 听到BootLoader大家一定很熟悉&#xff0c;在很多常见的系统中都会存在BootLoader。本文将介绍BootLoader的含义和简易实现&#xff0c;建议大家学习前掌握些原理基础。 …

目标检测算法:基本原理、发展历程、主要方法以及未来的发展趋势。

目标检测算法&#xff0c;作为计算机视觉领域中的一项关键技术&#xff0c;近年来得到了广泛的关注和研究。它旨在从图像或视频中准确地识别出目标的位置和类别&#xff0c;对于实现图像理解、视频分析、智能监控等应用具有重要意义。本文将详细介绍目标检测算法的基本原理、发…