【状态模式】设计模式系列:理解与实践(详细解读)

news2024/9/19 10:45:01

文章目录

  • 状态模式详解:理解与实践
    • 1. 引言
    • 2. 状态模式简介
      • 2.1 定义
      • 2.2 应用场景
      • 2.3 与其他模式的关系
    • 3. 状态模式的基本概念
      • 3.1 上下文(Context)类的角色
      • 3.2 状态(State)接口/抽象类
      • 3.3 具体状态(Concrete State)类
      • 3.4 UML类图和时序图
    • 4. 状态模式的工作原理
      • 4.1 如何通过状态对象来封装行为
      • 4.2 状态转换机制
      • 4.3 代码示例:简单的状态模式实现
    • 5. 状态模式的优缺点
      • 5.1 优点
      • 5.2 缺点
    • 6. 状态模式的变体和扩展
      • 6.1 使用组合模式增强状态模式
      • 6.2 状态图和状态机的概念
      • 6.3 在复杂系统中的应用
    • 7. 状态模式在实际项目中的应用案例
      • 7.1 案例一:订单系统的状态管理
      • 7.2 案例二:游戏开发中的角色状态
      • 7.3 案例三:GUI应用程序的状态处理
    • 8. 状态模式与其他设计模式的结合使用
      • 8.1 与策略模式结合
      • 8.2 与观察者模式结合
      • 8.3 与工厂模式结合
    • 9. 最佳实践和常见问题
    • 10. 状态模式的现代应用和发展趋势
    • 11. 结论

状态模式详解:理解与实践


1. 引言

设计模式是在软件工程领域中被广泛采用的一种解决特定问题的方法论。这些模式经过了长时间的实践检验,为开发者提供了一种通用的语言来描述软件组件的设计和交互方式。设计模式不仅可以提高代码的可读性和可维护性,还能帮助开发者更好地组织和管理代码,从而减少错误并加快开发速度。

在众多的设计模式中,状态模式是一种用于处理对象状态变化的设计模式,它允许一个对象在其内部状态改变时改变它的行为。这种模式使得对象看起来像是修改了它的类。状态模式对于那些需要根据不同的状态执行不同操作的情况非常有用,比如在游戏开发、工作流管理和自动化控制等领域。

本文将深入探讨状态模式,包括其定义、基本概念、应用场景以及与其他设计模式的关系等。我们还将通过具体的代码示例来演示如何在实际项目中应用状态模式。


2. 状态模式简介

2.1 定义

状态模式是一种行为型设计模式,它允许一个对象在其内部状态发生变化时改变它的行为。通过这种方式,对象似乎修改了它的类。在状态模式中,一个对象的行为取决于它的当前状态,而状态的变化会引发行为的变化。

2.2 应用场景

状态模式适用于以下几种情况:

  • 当一个对象的行为依赖于它的状态,并且它可以运行多种不同的行为时。
  • 当控制状态转换的条件表达式过于复杂时,可以使用状态模式将各种条件判断逻辑转移到表示不同状态的一系列类当中。
  • 当一个操作含有巨大的多分支结构,并且这些分支决定于对象的状态时。

2.3 与其他模式的关系

状态模式经常与其他设计模式配合使用,例如:

  • 策略模式:状态模式可以看作是策略模式的一个特例,其中不同的策略对应于不同的状态。
  • 工厂模式:通常会使用工厂模式来创建状态模式中的具体状态对象。
  • 观察者模式:当状态发生变化时,可以通过观察者模式通知相关的对象。

3. 状态模式的基本概念

3.1 上下文(Context)类的角色

上下文类定义了客户可以触发的状态转换,它也维护了一个对当前状态对象的引用。当上下文的状态发生变化时,它也会相应地改变自己的行为。通常情况下,上下文类将具体的业务逻辑委托给状态对象来处理。

3.2 状态(State)接口/抽象类

状态接口或抽象类定义了一个接口,该接口代表了所有具体状态所共有的方法。这些方法通常对应于上下文的各种行为。状态接口的作用是为所有具体状态提供一个共同的接口,这样上下文就可以使用一个统一的接口来与具体状态交互。

3.3 具体状态(Concrete State)类

具体状态类实现了状态接口中定义的方法。每个具体状态类代表了上下文的一个特定状态,并且包含了该状态下特定的行为。具体状态类之间可以通过调用上下文的方法来触发状态的转换。

3.4 UML类图和时序图

在这里插入图片描述
在这里插入图片描述


4. 状态模式的工作原理

4.1 如何通过状态对象来封装行为

在状态模式中,每个状态都是一个独立的对象,这些对象封装了与该状态相关的行为。这意味着当一个对象的状态发生变化时,它的行为也会随之变化。具体来说,状态对象通常包含以下方法:

  • doAction(): 这个方法定义了当前状态下对象的行为。
  • transitionTo(State state): 这个方法允许从当前状态过渡到另一个状态。

4.2 状态转换机制

状态转换机制是状态模式的核心。在状态模式中,上下文对象持有对当前状态对象的引用,并且能够根据需要切换到其他状态。状态转换通常由状态对象自身来控制,这有助于保持代码的清晰和简洁。

例如,当某个事件发生时,状态对象可能会调用上下文的setState()方法来改变自身的状态。这种方法使得状态之间的转换更加明确和易于跟踪。

4.3 代码示例:简单的状态模式实现

下面是一个简单的状态模式实现示例,假设有一个订单系统,订单可以处于三种状态:新建、支付和完成。

1. 上下文类(Order)

public class Order {
    private State currentState;

    public Order() {
        currentState = new NewOrder();
    }

    public void setState(State state) {
        this.currentState = state;
    }

    public void doAction() {
        currentState.doAction(this);
    }
}

2. 状态接口

public interface State {
    void doAction(Order order);
}

3. 具体状态类

public class NewOrder implements State {
    @Override
    public void doAction(Order order) {
        System.out.println("Processing the order...");
        order.setState(new PaidOrder());
    }
}

public class PaidOrder implements State {
    @Override
    public void doAction(Order order) {
        System.out.println("Order is paid, marking as completed...");
        order.setState(new CompletedOrder());
    }
}

public class CompletedOrder implements State {
    @Override
    public void doAction(Order order) {
        System.out.println("Order is already completed.");
    }
}

4. 主程序

public class Main {
    public static void main(String[] args) {
        Order order = new Order();
        order.doAction(); // 输出: Processing the order...
        order.doAction(); // 输出: Order is paid, marking as completed...
        order.doAction(); // 输出: Order is already completed.
    }
}

在这个例子中,Order 类是上下文,它持有一个状态对象的引用。每当调用 doAction() 方法时,当前状态就会执行相应的动作,并可能触发状态的转换。


5. 状态模式的优缺点

5.1 优点

  • 易于理解和维护:状态模式将不同的行为封装到独立的状态对象中,使得代码更容易理解和维护。
  • 遵循单一职责原则:每个状态类都有单一的责任,即管理一个特定状态下的行为。
  • 灵活性高:状态模式支持动态地添加新的状态,无需修改现有代码。
  • 减少条件语句:通过状态模式,可以避免在代码中出现大量的条件判断语句。

5.2 缺点

  • 增加类的数量:状态模式会为每一个状态创建一个类,这可能导致类的数量显著增加。
  • 过度设计:如果状态数量较少或状态转换逻辑简单,则使用状态模式可能会被认为是过度设计。

6. 状态模式的变体和扩展

6.1 使用组合模式增强状态模式

组合模式可以用来扩展状态模式的功能,特别是在状态之间存在层次关系的情况下。例如,可以使用组合模式来构建复合状态,这样可以在不增加太多类的情况下管理更复杂的状态结构。

6.2 状态图和状态机的概念

状态图是一种图形化的方式,用于描述系统或对象的状态及其转换。状态机则是一种形式化的模型,用来描述一个实体如何响应外部事件而改变状态的过程。状态图和状态机的概念与状态模式紧密相关,它们可以用来辅助设计和理解状态模式中的状态转换逻辑。

6.3 在复杂系统中的应用

在复杂的系统中,状态模式通常与其他设计模式一起使用,以管理更为复杂的业务逻辑。例如,在分布式系统中,可以使用状态模式来处理节点之间的状态同步问题;在大型企业应用中,可以使用状态模式来管理用户界面的状态。


7. 状态模式在实际项目中的应用案例

7.1 案例一:订单系统的状态管理

在电子商务系统中,订单的状态管理至关重要。订单可能经历多个阶段,如新建、已支付、已发货、已完成等。状态模式可以帮助我们清晰地管理这些状态,并且在状态之间平滑地过渡。

1. 上下文类(Order)

public class Order {
    private State currentState;

    public Order() {
        currentState = new NewOrder();
    }

    public void setState(State state) {
        this.currentState = state;
    }

    public void processPayment() {
        currentState.processPayment(this);
    }

    public void shipOrder() {
        currentState.shipOrder(this);
    }

    public void completeOrder() {
        currentState.completeOrder(this);
    }
}

2. 状态接口

public interface State {
    void processPayment(Order order);
    void shipOrder(Order order);
    void completeOrder(Order order);
}

3. 具体状态类

public class NewOrder implements State {
    @Override
    public void processPayment(Order order) {
        System.out.println("Processing payment...");
        order.setState(new PaidOrder());
    }

    @Override
    public void shipOrder(Order order) {
        System.out.println("Cannot ship an unpaid order.");
    }

    @Override
    public void completeOrder(Order order) {
        System.out.println("Cannot complete an unpaid order.");
    }
}

public class PaidOrder implements State {
    @Override
    public void processPayment(Order order) {
        System.out.println("Order is already paid.");
    }

    @Override
    public void shipOrder(Order order) {
        System.out.println("Order is being shipped...");
        order.setState(new ShippedOrder());
    }

    @Override
    public void completeOrder(Order order) {
        System.out.println("Cannot complete an unshipped order.");
    }
}

public class ShippedOrder implements State {
    @Override
    public void processPayment(Order order) {
        System.out.println("Order has already been processed.");
    }

    @Override
    public void shipOrder(Order order) {
        System.out.println("Order has already been shipped.");
    }

    @Override
    public void completeOrder(Order order) {
        System.out.println("Completing order...");
        order.setState(new CompletedOrder());
    }
}

public class CompletedOrder implements State {
    @Override
    public void processPayment(Order order) {
        System.out.println("Order has already been completed.");
    }

    @Override
    public void shipOrder(Order order) {
        System.out.println("Order has already been completed.");
    }

    @Override
    public void completeOrder(Order order) {
        System.out.println("Order is already completed.");
    }
}

4. 主程序

public class Main {
    public static void main(String[] args) {
        Order order = new Order();
        order.processPayment(); // 输出: Processing payment...
        order.shipOrder();      // 输出: Order is being shipped...
        order.completeOrder();  // 输出: Completing order...
        order.shipOrder();      // 输出: Order has already been completed.
    }
}

7.2 案例二:游戏开发中的角色状态

在游戏开发中,游戏角色的状态管理也是关键因素之一。角色可能有多种状态,如站立、行走、攻击等。状态模式可以帮助我们管理这些状态,并在不同的状态下实现不同的行为。

1. 上下文类(Character)

public class Character {
    private State currentState;

    public Character() {
        currentState = new StandState();
    }

    public void setState(State state) {
        this.currentState = state;
    }

    public void walk() {
        currentState.walk(this);
    }

    public void attack() {
        currentState.attack(this);
    }
}

2. 状态接口

public interface State {
    void walk(Character character);
    void attack(Character character);
}

3. 具体状态类

public class StandState implements State {
    @Override
    public void walk(Character character) {
        System.out.println("Character starts walking...");
        character.setState(new WalkState());
    }

    @Override
    public void attack(Character character) {
        System.out.println("Character cannot attack while standing.");
    }
}

public class WalkState implements State {
    @Override
    public void walk(Character character) {
        System.out.println("Character is already walking.");
    }

    @Override
    public void attack(Character character) {
        System.out.println("Character stops and attacks...");
        character.setState(new AttackState());
    }
}

public class AttackState implements State {
    @Override
    public void walk(Character character) {
        System.out.println("Character cannot walk while attacking.");
    }

    @Override
    public void attack(Character character) {
        System.out.println("Character continues attacking...");
    }
}

4. 主程序

public class Main {
    public static void main(String[] args) {
        Character character = new Character();
        character.walk();  // 输出: Character starts walking...
        character.attack(); // 输出: Character stops and attacks...
        character.walk();  // 输出: Character cannot walk while attacking.
    }
}

7.3 案例三:GUI应用程序的状态处理

在GUI应用程序中,界面元素的状态管理也很重要。例如,一个按钮可能有启用、禁用、按下等状态。状态模式可以帮助我们管理这些状态,并在不同的状态下实现不同的外观和行为。

1. 上下文类(Button)

public class Button {
    private State currentState;

    public Button() {
        currentState = new EnabledState();
    }

    public void setState(State state) {
        this.currentState = state;
    }

    public void click() {
        currentState.click(this);
    }

    public void enable() {
        currentState.enable(this);
    }

    public void disable() {
        currentState.disable(this);
    }
}

2. 状态接口

public interface State {
    void click(Button button);
    void enable(Button button);
    void disable(Button button);
}

3. 具体状态类

public class EnabledState implements State {
    @Override
    public void click(Button button) {
        System.out.println("Button clicked.");
    }

    @Override
    public void enable(Button button) {
        System.out.println("Button is already enabled.");
    }

    @Override
    public void disable(Button button) {
        System.out.println("Disabling the button...");
        button.setState(new DisabledState());
    }
}

public class DisabledState implements State {
    @Override
    public void click(Button button) {
        System.out.println("Button is disabled.");
    }

    @Override
    public void enable(Button button) {
        System.out.println("Enabling the button...");
        button.setState(new EnabledState());
    }

    @Override
    public void disable(Button button) {
        System.out.println("Button is already disabled.");
    }
}

4. 主程序

public class Main {
    public static void main(String[] args) {
        Button button = new Button();
        button.click();     // 输出: Button clicked.
        button.disable();   // 输出: Disabling the button...
        button.click();     // 输出: Button is disabled.
        button.enable();    // 输出: Enabling the button...
    }
}

8. 状态模式与其他设计模式的结合使用

8.1 与策略模式结合

状态模式和策略模式都可以用来改变对象的行为,但它们关注的是不同的方面。策略模式侧重于算法的选择,而状态模式侧重于状态的转换。结合使用这两种模式可以使对象的行为更加灵活和强大。

例如,在游戏开发中,一个角色可能有不同的攻击策略,这些策略可以根据角色的状态而变化。

8.2 与观察者模式结合

当状态变化时,有时需要通知其他对象。在这种情况下,可以将状态模式与观察者模式结合起来使用。状态对象可以作为观察者模式中的主题,当状态发生变化时,可以通知所有订阅者。

例如,在订单系统中,当订单的状态发生变化时,可以通过观察者模式通知相关的后台系统进行处理。

8.3 与工厂模式结合

当状态模式中有许多具体的状态类时,创建这些对象可能会变得繁琐。在这种情况下,可以使用工厂模式来创建具体的状态对象。工厂模式可以根据需要创建适当的状态对象,从而简化状态模式的使用。

例如,在订单系统中,可以使用工厂模式来创建订单的不同状态。


9. 最佳实践和常见问题

9.1 设计时的注意事项

  • 明确状态和行为:在设计状态模式之前,首先要明确对象有哪些状态以及在不同状态下应该执行哪些行为。
  • 合理划分状态:状态划分应尽可能简单明了,避免过多的状态导致管理困难。
  • 考虑状态转换的顺序:在设计状态转换逻辑时,要考虑状态转换的顺序是否合理,避免不必要的状态转换。

9.2 避免过度使用状态模式

  • 评估需求:在决定使用状态模式之前,要评估是否真的需要使用它。如果状态很少或者状态转换逻辑简单,那么使用简单的条件语句可能就足够了。
  • 考虑替代方案:有时候,使用其他设计模式(如策略模式)可能会更合适,特别是当状态不是主要关注点时。

9.3 性能考虑

  • 缓存状态对象:为了减少内存消耗,可以考虑使用单例模式或其他缓存技术来重用状态对象。
  • 避免频繁的状态转换:频繁的状态转换可能会导致性能下降,因此要尽量减少不必要的状态转换。

10. 状态模式的现代应用和发展趋势

10.1 在微服务架构中的应用

在微服务架构中,每个服务通常负责一部分业务逻辑,而这些服务之间的交互可能涉及状态的传递。状态模式可以用来管理这些服务之间的状态转换,确保数据的一致性和正确性。

10.2 事件驱动架构中的状态管理

在事件驱动架构中,状态模式可以用来处理事件触发的状态变化。这种模式可以很好地适应异步和非阻塞的编程模型,使得系统更加灵活和可扩展。

10.3 使用框架和库简化状态模式的应用

随着技术的发展,越来越多的框架和库开始支持状态模式的实现。例如,在前端开发中,React 等库提供了状态管理工具,如 Redux 和 Context API,这些工具可以帮助开发者更轻松地管理组件的状态。


11. 结论

回顾状态模式的关键点

  • 定义:状态模式是一种行为型设计模式,它允许一个对象在其内部状态改变时改变它的行为。
  • 作用:状态模式通过将行为与状态分离,使得对象可以在不同的状态下表现出不同的行为。
  • 应用场景:适用于需要根据状态执行不同操作的情况,特别是在游戏开发、工作流管理和自动化控制等领域。
  • 实现:通过定义状态接口和具体状态类,以及上下文类来管理状态转换。

本文详细介绍了23种设计模式的基础知识,帮助读者快速掌握设计模式的核心概念,并找到适合实际应用的具体模式:
【设计模式入门】设计模式全解析:23种经典模式介绍与评级指南(设计师必备)

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

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

相关文章

用Python解决预测问题_多元线性回归模板

多元线性回归是一种统计学方法,用于分析两个或多个自变量(解释变量)与一个因变量(响应变量)之间的关系。在最简单的线性回归模型中,只有一个自变量和一个因变量,它们之间的关系可以用一条直线来…

Java对象的内存结构

文章目录 概述1. 对象头 (Header)Mark Word1. 32位HotSpot虚拟机中的MarkWord2. 64位HotSpot虚拟机中的MarkWord Class PointerArray Length指针压缩原理指针压缩测试 2. 实例数据 (Instance Data)3. 填充数据 (Padding Data) 查看 Java 对象的内存结构使用反射和VisualVM、JCo…

linux下的oracle启动命令

一、服务器断电后,手工启动oracle数据库步骤如下: 1、进入数据库服务器,切换到oracle用户,命令:su - oracle 2、启动数据库,命令: 1) sqlplus / as sysdba 2) startup 3)如果数据库已…

Rabbit mq 虚拟机stop无法重启

之前从后台进去&#xff0c;这个地方死活无法重启 然后重启docker 以及mq都不行 docker exec -it <CONTAINER_ID_OR_NAME> /bin/bash rabbitmqctl stop_app rabbitmqctl start_app 最后删除虚拟机&#xff0c;然后重建就行了 rabbitmqctl delete_vhost / rabbitmqctl…

C++ | Leetcode C++题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; class Solution { public:bool canMeasureWater(int x, int y, int z) {if (x y < z) {return false;}if (x 0 || y 0) {return z 0 || x y z;}return z % gcd(x, y) 0;} };

iPhone设备使用技巧:忘记密码的情况下如何解除iOS 18/17屏幕时间

我们给了儿子一部新手机。在尝试擦除旧手机上的所有内容并恢复出厂设置时&#xff0c;它要求提供 4 位屏幕时间密码。我已经尝试了我们会使用的所有可能性&#xff0c;但无法弄清楚。我们如何绕过这个问题或将手机恢复出厂设置以便我们可以出售它&#xff1f; Apple 社区 对于…

小琳AI课堂:Langchain

大家好&#xff0c;这里是小琳AI课堂&#xff0c;今天我们要探索一个令人兴奋的AI新概念——Langchain。 想象一下&#xff0c;如果我们可以把强大的大型语言模型&#xff0c;比如GPT-3&#xff0c;像乐高积木一样组合起来&#xff0c;会怎么样&#xff1f;这就是Langchain的核…

自定义开屏启动广告页

自定义开屏启动广告页 文章目录 自定义开屏启动广告页效果图简单版轮播方式css 效果图 简单版 图片 倒计时 <template><view class"guide fcc" :style"{ background: url(${ imgUrl }) no-repeat}"><view class"skip_btn" cli…

矢泽妮可二次元html视频动态引导页源码

源码介绍 矢泽妮可二次元html视频动态引导页源码 源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果预览 源码下载 矢泽妮可二次…

Linux系统下的容器安全:深入解析与最佳实践

在云计算和微服务架构的推动下&#xff0c;容器技术因其高效、可移植和灵活的特点&#xff0c;已经成为现代软件开发和部署的首选方案。然而&#xff0c;容器的广泛应用也带来了新的安全挑战&#xff0c;尤其是在Linux系统下&#xff0c;容器安全的实现和维护变得尤为重要。本文…

了解芯片的四大主流架构

四大主流芯片架构&#xff0c;犹如科技领域的四大支柱&#xff0c;各自矗立于技术创新的巅峰。这四大架构——X86、ARM、RISC-V与MIPS&#xff0c;不仅是芯片设计的基石&#xff0c;更是推动信息技术进步的强大动力。 一、芯片架构是什么&#xff1f; 芯片架构是指对芯片的类…

C++ 设计模式——外观模式

外观模式 C 设计模式——外观模式主要组成部分1. 外观类&#xff08;Facade&#xff09;2. 子系统类&#xff08;Subsystem&#xff09;3. 客户端&#xff08;Client&#xff09; 例一&#xff1a;工作流程示例1. 外观类&#xff08;Facade&#xff09;2. 子系统类&#xff08;…

GPU池化技术在油气勘探开发中的应用

01 背景介绍 国内某研究院为实现石油勘探开发专业软件资源的统一管理、统一监控、统一共享和统一计量&#xff0c;自主研发了勘探云管理平台(EPCP)和科研工作业务协同平台。该研究院通过两个平台实现了数十种专业勘探开发软件的共享&#xff0c;种类包括地震资料处理和解释&am…

中国四向穿梭车各角色、各玩家:大盘点

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 四向穿梭车作为现代物流自动化的关键设备&#xff0c;正在全球范围内迅速发展。 本文将对四向穿梭车的不同类别的厂商进行大盘点&#x…

pdfplumber - pdf 数据提取

文章目录 一、关于 pdfplumber安装 二、命令行界面1、基本示例2、选项 三、Python库1、基本示例2、加载PDF3、pdfplumber.PDF类4、pdfplumber.Page 类5、对象char特性line属性rect属性curve 属性派生属性image属性 6、通过pdfminer获取更高级别的pdfminer.six 四、可视化调试1、…

92.WEB渗透测试-信息收集-Google语法(6)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;91.WEB渗透测试-信息收集-Google语法&#xff08;5&#xff09; 监控的漏洞也有很多 打…

探索人工智能的未来:埃里克·施密特2024斯坦福大学分享四

一、语言模型的经济影响 关于语言模型的经济影响&#xff0c;我想先谈谈市场的影响。我们看到一些服务领域的变化速度比预期的要慢&#xff0c;比如 CHEG 和其他相关服务的表现。对此&#xff0c;您是否认为学术界应该获得人工智能补贴&#xff1f;还是说&#xff0c;他们应该…

树刷题codetop!!暴打面试题!!!!

题源codetop标签近半年树 1.二叉树的层序遍历2.二叉树的层序遍历II3.二叉树的锯齿形层次遍历4.N叉树的层次遍历5.二叉树的最近公共祖先6.二叉搜索树的最近公共祖先7.二叉树的直径8.二叉树中最大路径和9.二叉树的前序遍历10.从前序与中序遍历序列构造二叉树11.从中序与后序遍历序…

Tomcat:企业 WEB 奇境的开启密钥

目录 一.Tomcat 优势 二.前端三大核心技术 1.HTML 2.CSS&#xff08;Cascading Style Sheets&#xff09;层叠样式表 3.JavaScript 三.WEB框架 1.web资源和访问:PC 端或移动端浏览器访问 2.web资源和访问:手机 App 访问 四.单体架构 五.微服务 1.微服务的优点 2.微…

【第55课】XSS防御HttpOnlyCSP靶场工具等

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0…