Java 设计者模式以及与Spring关系(七) 命令和迭代器模式

简介:

本文是个系列一次会出两个设计者模式作用,如果有关联就三个,除此外还会讲解在spring中作用。

23设计者模式以及重点模式

我们都知道设计者模式有3类23种设计模式,标红是特别重要的设计者模式建议都会,而且熟读于心,标蓝是指其次重要建议也要明白。

(1)创建型模式:单例模式、抽象工厂模式、构建者模式、工厂模式、原型模式。

(2)结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。

(3)行为型模式:访问者模式、模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式。

命令模式(Command Pattern)

命令模式是一种行为型设计模式,它将请求或简单的操作封装成一个对象。这种模式的主要目的是将请求发送者与接收者解耦,使得发送者和接收者不直接交互。命令模式允许将请求排队处理、记录请求日志以及实现可撤销的操作。

组成部分:
  1. 命令接口(Command):定义执行操作的接口。
  2. 具体命令(ConcreteCommand):实现命令接口的类,定义了接收者和动作之间的绑定关系。
  3. 接收者(Receiver):知道如何实施和执行一个请求相关的操作。
  4. 调用者(Invoker):要求命令对象执行请求。
  5. 客户端(Client):创建具体命令对象,并设置其接收者。

命令模式 主要用于将操作的请求者和执行者解耦,允许将请求封装成对象,从而使用不同的请求、队列或日志参数化其他对象,并支持可撤销的操作。

示例
java 复制代码
// 命令接口
interface Command {
    void execute();
}

// 接收者
class Light {
    public void turnOn() {
        System.out.println("The light is on");
    }

    public void turnOff() {
        System.out.println("The light is off");
    }
}

// 具体命令
class TurnOnCommand implements Command {
    private Light light;

    public TurnOnCommand(Light light) {
        this.light = light;
    }

    public void execute() {
        light.turnOn();
    }
}

class TurnOffCommand implements Command {
    private Light light;

    public TurnOffCommand(Light light) {
        this.light = light;
    }

    public void execute() {
        light.turnOff();
    }
}

// 调用者
class RemoteControl {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void pressButton() {
        command.execute();
    }
}

// 客户端
public class CommandPatternDemo {
    public static void main(String[] args) {
        Light light = new Light();
        Command turnOn = new TurnOnCommand(light);
        Command turnOff = new TurnOffCommand(light);

        RemoteControl control = new RemoteControl();
        control.setCommand(turnOn);
        control.pressButton();
        control.setCommand(turnOff);
        control.pressButton();
    }
}

在这个例子中,Light 是一个接收者,TurnOnCommandTurnOffCommand 是具体命令,它们实现了 Command 接口。RemoteControl 是调用者,它通过 pressButton 方法来执行命令。客户端代码创建了命令对象并将其与接收者关联。

迭代器模式(Iterator Pattern)

迭代器模式是一种行为型设计模式,它提供一种方法来顺序访问聚合对象中的各个元素,而又无需暴露该对象的内部表示。

组成部分:
  1. 迭代器接口(Iterator):定义访问和遍历元素的接口。
  2. 具体迭代器(ConcreteIterator):实现迭代器接口,负责管理当前元素的位置,并能够计算出下一个元素。
  3. 聚合接口(Aggregate):定义创建相应迭代器对象的接口。
  4. 具体聚合(ConcreteAggregate):实现聚合接口,返回一个具体迭代器的实例。

迭代器模式 用于顺序访问集合对象的元素,而不需要暴露其底层表示,提供了一种统一的方法来遍历各种类型的集合。

示例
java 复制代码
import java.util.*;

// 迭代器接口
interface Iterator {
    boolean hasNext();
    Object next();
}

// 聚合接口
interface Container {
    Iterator getIterator();
}

// 具体聚合
class NameRepository implements Container {
    public String names[] = {"John", "Doe", "Jane", "Smith"};

    @Override
    public Iterator getIterator() {
        return new NameIterator();
    }

    private class NameIterator implements Iterator {
        int index;

        @Override
        public boolean hasNext() {
            return index < names.length;
        }

        @Override
        public Object next() {
            if (this.hasNext()) {
                return names[index++];
            }
            return null;
        }
    }
}

// 客户端
public class IteratorPatternDemo {
    public static void main(String[] args) {
        NameRepository namesRepository = new NameRepository();

        for (Iterator iter = namesRepository.getIterator(); iter.hasNext();) {
            String name = (String) iter.next();
            System.out.println("Name : " + name);
        }
    }
}

在这个示例中,NameRepository 是一个具体聚合,它实现了 Container 接口,并内部定义了 NameIterator,这是一个具体的迭代器实现。客户端通过 NameRepositorygetIterator 方法获取迭代器,并使用它来遍历名称。

相关推荐
用户2986985301417 小时前
Word 文档字符级格式化:Java 实现方案详解
java·后端
笨鸟飞不快18 小时前
从单个服务到集群:一次完整的性能排查复盘
java·前端
荣码18 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
SamDeepThinking18 小时前
Java微服务练习方式
java·后端·微服务
朦胧之1 天前
AI 编程-老项目改造篇
java·前端·后端
程序猿大帅1 天前
别再只当调包侠了:用 Spring AI 落地 Function Calling,我被大模型硬生生砸出了三个大坑
java
程序员晓琪1 天前
约定大于配置:基于 Java 包名自动生成 API 版本路由的最佳实践
java·spring boot·后端
Flittly1 天前
【AgentScope Java新手村系列】(11)中断与恢复
java·spring boot·spring
众少成多积小致巨1 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
东坡白菜1 天前
破局全栈:前端开发的Java入门实战记录—JPA(2)
java·后端