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

devtools/2024/12/22 9:15:37/

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

适配器模式

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

使用场景:

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

优点:

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

缺点:

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

使用注意事项:

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

代码示例:

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();}
}
桥接模式

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

使用场景:

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

优点:

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

缺点:

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

使用注意事项:

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

代码示例:

java">// 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();}
}
组合模式

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

使用场景:

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

优点:

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

缺点:

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

使用注意事项:

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

代码示例:

java">// 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();}
}
迭代器模式

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

使用场景:

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

优点:

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

缺点:

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

使用注意事项:

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

代码示例:

java">// 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.ppmy.cn/devtools/85409.html

相关文章

Linux搭建Kubernetes集群(单Master)【附图文】

文章目录 一、集群环境配置要求二、主机准备三、初始环境准备1.修改主机名和host文件2.关闭防火墙3.关闭 selinux4.关闭swap4.加载 br_netfilter 模块5.允许iptables转发流量6.设置时间同步 四、安装Docker五、安装kubeadm, kubectl, kubelet六、在Master节点部署集群七、将 no…

算法刷题笔记 堆优化版的Dijkstra算法求最短路(C++实现。包含详细思路分析和对C++中priority_queue的介绍)

文章目录 题目描述基本思路实现代码 题目描述 给定一个n个点m条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为非负值。请你求出1号点到n号点的最短距离&#xff0c;如果无法从1号点走到n号点&#xff0c;则输出−1。 输入格式 第一行包含整数n和m。…

Docker安全管理与HTTPS协议

1 Docker容器的安全管理注意事项 Docker本身的架构与机制就可能产生问题&#xff0c;例如这样一种攻击场景&#xff0c;黑客已经控制了宿主机上的一些容器&#xff0c;或者获得了通过在公有云上建立容器的方式&#xff0c;然后对宿主机或其他容器发起攻击。 1. 容器之间的局…

python-爬虫实例(4):获取b站的章若楠的视频

目录 前言 道路千万条&#xff0c;安全第一条 爬虫不谨慎&#xff0c;亲人两行泪 获取b站的章若楠的视频 一、话不多说&#xff0c;先上代码 二、爬虫四步走 1.UA伪装 2.获取url 3.发送请求 4.获取响应数据进行解析并保存 总结 前言 道路千万条&#xff0c;安全第一条 爬…

数据库实验:SQL Server创建数据库及基本表

一、实验目的&#xff1a; 1、掌握使用SQL SERVER Management Studio工具连接数据库引擎&#xff1b; 2、掌握使用CREATE TABLE 创建基本表的用法&#xff1b; 3、掌握使用ALTER TABLE 修改基本表的用法&#xff1b; 4、掌握使用DROP TABLE删除基本表的用法&#xff1b; 二…

FLINKCDC连接oracle导致归档日志暴增

前言 前段时间再用flinkcdc连接oracle的时候&#xff0c;oracle的归档日志疯狂的飙升,我经常去到归档目录下查看占用的内存情况。。 情况 在使用flinkcdc连接oracle的时候&#xff0c;发现归档日志飙升&#xff0c;查看了很多文档&#xff0c;该配置了都配置了&#xff0c; …

【概率论】第一章:概率论基本概念

文章目录 一. 随机事件与空间样本二. 事件间的关系与事件的运算三. 概率、条件概率、事件独立性与五大公式1. 概率2. 条件概率3. 事件独立性4. 五大公式 四. 古典型、几何型概率、伯努利试验 确定现象&#xff1a;磁极同性相斥 随机现象&#xff1a;在单次实验结果中呈现出不确…

学习笔记12:域名。全球加速,自定义源站,自定义CDN加速

域名。全球加速&#xff0c;自定义源站&#xff0c;自定义CDN加速 域名、全球加速、自定义源站和自定义CDN加速是网络和网站管理中常见的概念&#xff0c;主要用于提高网站访问速度和可靠性。下面我将逐一解释这些术语&#xff1a; 1. 域名&#xff08;Domain Name&#xff0…