【设计模式】行为型模式(一):模板方法模式、观察者模式

news/2024/11/14 11:10:07/

行为型模式(一):模板方法模式观察者模式

  • 1.模板方法模式(Template)
    • 1.1 主要特点
    • 1.2 适用场景
    • 1.3 示例
      • 1.3.1 抽象类定义模板方法
      • 1.3.2 子类实现具体步骤
      • 1.3.3 客户端
      • 1.3.4 结果输出
  • 2.观察者模式Observer
    • 2.1 主要特点
    • 2.2 适用场景
    • 2.3 示例
      • 2.3.1 观察者
      • 2.3.2 主题
      • 2.3.3 具体主题
      • 2.3.4 具体观察者
      • 2.3.5 客户端
      • 2.3.6 结果输出

1.模板方法模式(Template)

模板方法模式Template Method)是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些特定步骤。

1.1 主要特点

  • 定义算法框架:父类定义了执行某个操作的框架,但具体的实现细节留给子类完成。
  • 防止子类修改:模板方法在父类中定义为 final,防止子类修改算法的总体结构。
  • 钩子方法:父类可以定义一些 钩子 方法,子类可以选择性地实现这些方法,以影响算法的行为。

1.2 适用场景

  • 当你有一个算法的多个变体,但它们的某些步骤是相同的,可以将这些相同的步骤提取到父类中。
  • 当你希望子类能够扩展某个算法的某些特定步骤,但不能改变算法的整体结构。

1.3 示例

假设你有一个制作咖啡和茶的过程,它们的步骤大致相同,但某些细节不同。

1.3.1 抽象类定义模板方法

java">// 抽象类定义了模板方法
abstract class Beverage {// 模板方法,定义了算法的框架final void prepareBeverage() {boilWater();brew();pourInCup();addCondiments();}// 具体步骤,由子类实现abstract void brew();abstract void addCondiments();// 具体步骤,已经在父类中实现void boilWater() {System.out.println("Boiling water");}void pourInCup() {System.out.println("Pouring into cup");}
}

1.3.2 子类实现具体步骤

java">// 子类实现具体的步骤
class Coffee extends Beverage {void brew() {System.out.println("Dripping coffee through filter");}void addCondiments() {System.out.println("Adding sugar and milk");}
}class Tea extends Beverage {void brew() {System.out.println("Steeping the tea");}void addCondiments() {System.out.println("Adding lemon");}
}

1.3.3 客户端

java">// 客户端代码
public class TemplateMethodDemo {public static void main(String[] args) {Beverage coffee = new Coffee();coffee.prepareBeverage();System.out.println();Beverage tea = new Tea();tea.prepareBeverage();}
}

1.3.4 结果输出

Boiling water
Dripping coffee through filter
Pouring into cup
Adding sugar and milkBoiling water
Steeping the tea
Pouring into cup
Adding lemon

在这个例子中,Beverage 类定义了制作饮料的模板方法 prepareBeverage,具体的步骤 brewaddCondiments 由子类 CoffeeTea 实现。这样,子类可以在不改变整体算法结构的情况下,实现具体的细节。

Observer_97">2.观察者模式Observer

观察者模式Observer)是一种行为设计模式它定义了对象之间的一对多依赖关系,当一个对象(称为 主题发布者)的状态发生变化时,所有依赖于它的对象(称为 观察者订阅者)都会自动得到通知并更新。

在这里插入图片描述

2.1 主要特点

  • 主题Subject):维护一个观察者列表,并提供添加、删除和通知观察者的方法。
  • 观察者Observer):定义一个更新接口,当主题状态发生变化时,观察者会收到通知并更新自己的状态。
  • 具体主题Concrete Subject):实现主题接口,当状态发生变化时,通知所有观察者。
  • 具体观察者Concrete Observer):实现观察者接口,根据主题的状态变化更新自己的状态。

2.2 适用场景

  • 当一个对象的改变需要同时改变其他多个对象时,可以使用观察者模式
  • 当一个对象需要与多个其他对象保持一致,但又不想直接依赖这些对象时,可以使用观察者模式

2.3 示例

假设你有一个天气站,当天气变化时,需要通知多个显示设备(如温度显示器、湿度显示器等)更新显示。

2.3.1 观察者

java">// 观察者接口
interface Observer {void update(float temperature, float humidity, float pressure);
}

2.3.2 主题

java">// 主题接口
interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();
}

2.3.3 具体主题

java">// 具体主题
class WeatherData implements Subject {private List<Observer> observers;private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList<>();}@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(temperature, humidity, pressure);}}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;measurementsChanged();}private void measurementsChanged() {notifyObservers();}
}

2.3.4 具体观察者

java">// 具体观察者
class CurrentConditionsDisplay implements Observer {private float temperature;private float humidity;@Overridepublic void update(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;display();}public void display() {System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");}
}

2.3.5 客户端

java">// 客户端代码
public class ObserverPatternDemo {public static void main(String[] args) {WeatherData weatherData = new WeatherData();CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay();weatherData.registerObserver(currentConditionsDisplay);weatherData.setMeasurements(80, 65, 30.4f);System.out.println();weatherData.setMeasurements(82, 70, 29.2f);}
}
  • WeatherData 是主题,维护了一个观察者列表,并提供注册、移除和通知观察者的方法。
  • CurrentConditionsDisplay 是观察者,实现了 Observer 接口,当天气数据变化时,会收到通知并更新显示。
  • 天气站 WeatherData 注册了一个观察者 CurrentConditionsDisplay,当天气数据变化时,观察者会自动更新显示。

2.3.6 结果输出

Current conditions: 80.0F degrees and 65.0% humidityCurrent conditions: 82.0F degrees and 70.0% humidity

通过观察者模式,可以实现对象之间的解耦,使得一个对象的变化能够自动通知其他对象,而不需要知道这些对象的具体信息。


http://www.ppmy.cn/news/1546903.html

相关文章

k8s-service、endpoints、pod之间是怎么进行网络互通的

k8s-service、endpoints、pod之间是怎么进行网络互通的 1、service2、endpoints3、service、endpoints、pod通信图4、不同服务pod内部间访问 1、service 在K8S中&#xff0c;Service是一种抽象&#xff0c;定义了一组Pod的逻辑集合和访问这些Pod的策略。首先&#xff0c;我们需…

Unity3D 制作MMORPG 3D地图编辑器详解

前言 在MMORPG&#xff08;大型多人在线角色扮演游戏&#xff09;开发中&#xff0c;地图编辑器是一个至关重要的工具。它不仅能帮助开发者快速创建游戏世界&#xff0c;还能设计各种地形和场景。本文将详细介绍如何使用Unity3D制作一个3D地图编辑器&#xff0c;包括技术详解和…

图论基本术语

图论算法 —— 图论概述-CSDN博客 理论基础 —— 图_依附于顶点v是什么意思-CSDN博客 理论基础 —— 图 —— 图的存储结构_十字链表和链式前向星-CSDN博客 语雀版本 概括&#xff1a;图是计算机中常用的一种存储结构&#xff0c;图论是数学的一个分支&#xff0c;他以图为…

JAVA-队列

一、队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾&#xff08;Tail/Rear&#xff09; 出队列&#xff1a…

GitLab 如何跨版本升级?

本分分享 GitLab 跨版本升级的一些注意事项。 众所周知&#xff0c;GitLab 的升级必须要严格遵循升级路径&#xff0c;否则就会出现问题&#xff0c;导致升级失败。因此&#xff0c;在 GitLab 升级之前需要做好两件事情&#xff1a; 当前版本的确认升级路径的确认 极狐GitLa…

[基础] 003 使用github提交作业

注意 : 这篇文章是水分子HOH社区举办的move共学营中提交作业的方法 项目地址 : https://github.com/move-cn/letsmove/ 第一步 : fork 项目 fork项目就是将官方的仓库同步一份到自己github上,但需要注意的是这个同步不是实时同步,每次自己拉取代码之前需要手动同步一下 create…

Excel打印图片变形:问题根源与解决方案

在日常的办公和学习中&#xff0c;Excel作为数据处理和展示的利器&#xff0c;被广泛应用于各种场景。然而&#xff0c;当我们在Excel中插入并尝试打印圆形图片时&#xff0c;却常常会遇到图片变形的问题。一个原本正常的圆形图片&#xff0c;在打印预览或实际打印出来时&#…

对称加密与非对称加密:密码学的基石及 RSA 算法详解

对称加密与非对称加密&#xff1a;密码学的基石及 RSA 算法详解 在当今数字化的时代&#xff0c;信息安全至关重要。对称加密和非对称加密作为密码学中的两种基本加密技术&#xff0c;为我们的数据安全提供了强大的保障。本文将深入探讨对称加密和非对称加密的特点、应用场景&…