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 方法获取迭代器,并使用它来遍历名称。

相关推荐
xrkhy4 分钟前
反射, 注解, 动态代理
java
Ten peaches16 分钟前
Selenium-Java版(操作元素)
java·selenium·测试工具·html
lyw2056191 小时前
RabbitMQ,Kafka八股(自用笔记)
java
邹诗钰-电子信息工程1 小时前
嵌入式自学第二十一天(5.14)
java·开发语言·算法
有梦想的攻城狮1 小时前
spring中的@MapperScan注解详解
java·后端·spring·mapperscan
寒小松1 小时前
Problem E: List练习
java·数据结构·list
zimoyin1 小时前
Kotlin 协程实战:实现异步值加载委托,对值进行异步懒初始化
java·前端·kotlin
柚个朵朵2 小时前
Spring的Validation,这是一套基于注解的权限校验框架
java·后端·spring
程序员小杰@2 小时前
【MCP教程系列】SpringBoot 搭建基于 Spring AI 的 SSE 模式 MCP 服务
人工智能·spring boot·spring
2301_803554522 小时前
c++和c的不同
java·c语言·c++