Java 设计模式(创建型)

文章目录

  • 工厂模式
  • 单例模式
  • 抽象工厂模式
  • 建造者模式
  • 原型模式

工厂模式

工厂模式(Factory Pattern)是一种创建型设计模式,用于创建对象的接口,但是由子类决定要实例化的类是哪一个。它提供了一种将对象的实例化过程封装起来的方法,从而使得客户端代码与具体创建对象的类解耦。

  • 结构

    1. 抽象产品(Product):定义了产品的接口或抽象类,通常是工厂所创建的对象的共同基类。
    2. 具体产品(Concrete Product):实现了抽象产品接口或继承了抽象产品类,是工厂模式所创建的具体对象。
    3. 抽象工厂(Factory):声明了工厂方法(Factory Method),用于创建抽象产品的接口或抽象类。
    4. 具体工厂(Concrete Factory):实现了抽象工厂接口或继承了抽象工厂类,负责创建具体产品的对象。
    5. 客户端(Client):使用工厂对象创建具体产品对象的类。
  • 场景

    1. 对象的创建需要复杂逻辑:当对象的创建过程比较复杂或者需要根据不同条件创建不同的对象时,工厂模式可以将创建过程封装起来,提供一个统一的接口。
    2. 需要解耦对象的使用和创建:当需要在客户端代码中解耦对象的使用和创建时,工厂模式是一个不错的选择,客户端只需要知道工厂接口或抽象类,而不需要关心具体的实现细节。
    3. 需要动态切换产品族:工厂模式可以根据需要动态地选择产品族,比如根据用户的地区或语言选择不同的产品。
  • 优点

    1. 解耦:工厂模式将客户端代码与具体的创建逻辑分离,客户端只需要知道工厂接口或抽象类,不需要关心具体的实现细节,从而降低了耦合度。
    2. 封装性:工厂模式将对象的创建过程封装在工厂类中,使得客户端无需知道创建对象的细节,同时也隐藏了创建对象的具体实现。
    3. 可扩展性:通过添加新的具体工厂类,可以很容易地向系统中添加新的产品,而不需要修改已有的代码。
  • 缺点

    1. 类的数量增加:每个具体产品都需要对应一个具体工厂类,可能会导致类的数量增加,从而增加了系统的复杂性。
    2. 不适合复杂对象的创建:当创建对象的过程比较复杂或者需要初始化大量的参数时,工厂模式可能会变得笨重,并且不够灵活。
  • 示例

// 抽象产品:手机
interface Phone {void call();
}// 具体产品:小米手机
class Xiaomi implements Phone {@Overridepublic void call() {System.out.println("使用小米手机打电话");}
}// 具体产品:华为手机
class Huawei implements Phone {@Overridepublic void call() {System.out.println("使用华为手机打电话");}
}// 抽象工厂:手机工厂
interface PhoneFactory {Phone createPhone();
}// 具体工厂:小米手机工厂
class XiaomiFactory implements PhoneFactory {@Overridepublic Phone createPhone() {return new Xiaomi();}
}// 具体工厂:华为手机工厂
class HuaweiFactory implements PhoneFactory {@Overridepublic Phone createPhone() {return new Huawei();}
}// 客户端代码
public class Main {public static void main(String[] args) {// 创建小米手机PhoneFactory xiaomiFactory = new XiaomiFactory();Phone xiaomiPhone = xiaomiFactory.createPhone();xiaomiPhone.call();// 创建华为手机PhoneFactory huaweiFactory = new HuaweiFactory();Phone huaweiPhone = huaweiFactory.createPhone();huaweiPhone.call();}
}
  • 输出结果
使用小米手机打电话
使用华为手机打电话

单例模式

单例模式(Singleton Pattern)是一种创建型设计模式,旨在确保类只有一个实例,并提供全局访问点。

  • 结构

    1. 私有构造函数:确保其他类无法通过构造函数创建实例。
    2. 静态变量:在类内部创建一个私有静态变量来保存单例实例。
    3. 静态方法:提供一个静态方法来获取单例实例,如果实例不存在,则在此方法内部创建实例并返回。
  • 场景

    1. 资源管理器:例如线程池、数据库连接池等资源管理器常常使用单例模式,以确保全局只有一个资源管理器实例。
    2. 配置管理器:应用程序的配置管理器通常以单例模式实现,以确保全局只有一个配置管理器实例。
    3. 日志记录器:日志记录器通常以单例模式实现,以确保在应用程序中的任何位置都可以轻松访问和使用日志记录功能。
    4. 窗口管理器:图形用户界面(GUI)应用程序中的窗口管理器通常以单例模式实现,以确保全局只有一个窗口管理器实例来管理所有窗口。
  • 优点

    1. 全局唯一性:确保一个类只有一个实例,全局范围内提供该实例的访问点。
    2. 延迟实例化:单例对象通常在首次被请求时才被实例化,从而节省了系统资源。
    3. 简化访问:通过全局访问点,简化了对单例对象的访问和管理。
  • 缺点

    1. 可能引起性能问题:在高并发情况下,单例模式可能成为性能瓶颈,因为所有线程都必须等待获取单例对象。
    2. 可能引起线程安全问题:如果没有正确地实现线程安全措施,可能会导致多线程环境下出现多个实例。
  • 示例1

class Singleton {// 使用 volatile 关键字确保 instance 在多线程环境下的可见性private static volatile Singleton instance;// 私有构造函数,防止外部通过构造函数创建实例private Singleton() {}// 提供全局访问点获取唯一实例public static Singleton getInstance() {// 双重检查锁定,提高效率并确保线程安全if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}// 示例方法public void exampleMethod() {System.out.println("这是单例模式中的示例方法。");}
}// 客户端代码
public class Main {public static void main(String[] args) {// 获取单例实例Singleton singleton = Singleton.getInstance();// 调用示例方法singleton.exampleMethod();}
}
  • 输出结果
这是单例模式中的示例方法。
  • 示例2
class ConfigurationManager {// 私有静态变量保存唯一实例private static ConfigurationManager instance;// 私有构造函数,防止外部通过构造函数创建实例private ConfigurationManager() {// 在这里可以进行配置的初始化工作System.out.println("配置管理器初始化完成。");}// 提供全局访问点获取唯一实例public static ConfigurationManager getInstance() {// 懒汉式单例模式实现,第一次调用时才实例化对象if (instance == null) {instance = new ConfigurationManager();}return instance;}// 示例方法:获取配置项public String getConfig(String key) {// 这里可以根据 key 获取相应的配置项return "配置项:" + key;}
}// 客户端代码
public class Main {public static void main(String[] args) {// 获取配置管理器实例ConfigurationManager configManager = ConfigurationManager.getInstance();// 使用配置管理器获取配置项String configValue = configManager.getConfig("database.url");System.out.println(configValue);}
}
  • 输出结果
配置管理器初始化完成。
配置项:database.url

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它属于工厂模式的一种扩展,通过提供一个抽象工厂接口,可以创建一组相关的产品对象,而不是单个产品。

  • 结构

    1. 抽象工厂接口:定义了创建一组相关产品对象的方法,每个方法对应一个产品。
    2. 具体工厂类:实现了抽象工厂接口,负责创建具体的产品对象。
    3. 抽象产品接口:定义了产品对象的接口,每个具体产品类都实现了该接口。
    4. 具体产品类:实现了抽象产品接口,代表了具体的产品对象。
  • 场景

    1. 跨平台产品:抽象工厂模式可以用于创建跨平台产品,比如同时在 Windows 和 macOS 上创建应用程序,每个平台都有自己的按钮、文本框等 UI 组件。
    2. 产品族:抽象工厂模式适用于需要一次性创建一系列相关或相互依赖的产品对象的场景,比如创建一个汽车工厂,可以生产不同品牌的汽车,每个品牌又包括不同型号的车型。
    3. 数据库访问:在数据库访问中,抽象工厂模式可以用于创建不同类型的数据库连接、命令和数据读取器,以适应不同数据库的需求。
  • 优点

    1. 封装性:抽象工厂模式将产品的创建过程封装在工厂类中,客户端不需要知道具体的创建细节,只需要通过工厂接口来创建产品。
    2. 灵活性:可以在运行时动态切换具体工厂类,从而创建不同系列的产品对象,满足不同的需求。
    3. 易于扩展:增加新的具体工厂和产品类非常容易,无需修改现有代码,符合开闭原则。
  • 缺点

    1. 复杂性:随着产品系列的增加,抽象工厂模式的类数量会增加,导致系统复杂度增加。
    2. 耦合性:抽象工厂模式中各个具体工厂类与具体产品类之间存在一定的耦合性,增加了系统的耦合度。
  • 示例

// 抽象产品接口:按钮
interface Button {void display();
}// 具体产品:Spring按钮
class SpringButton implements Button {@Overridepublic void display() {System.out.println("显示浅绿色按钮");}
}// 具体产品:Summer按钮
class SummerButton implements Button {@Overridepublic void display() {System.out.println("显示浅蓝色按钮");}
}// 抽象产品接口:文本框
interface TextField {void display();
}// 具体产品:Spring文本框
class SpringTextField implements TextField {@Overridepublic void display() {System.out.println("显示浅绿色文本框");}
}// 具体产品:Summer文本框
class SummerTextField implements TextField {@Overridepublic void display() {System.out.println("显示浅蓝色文本框");}
}// 抽象工厂接口
interface SkinFactory {Button createButton();TextField createTextField();
}// 具体工厂:Spring皮肤工厂
class SpringSkinFactory implements SkinFactory {@Overridepublic Button createButton() {return new SpringButton();}@Overridepublic TextField createTextField() {return new SpringTextField();}
}// 具体工厂:Summer皮肤工厂
class SummerSkinFactory implements SkinFactory {@Overridepublic Button createButton() {return new SummerButton();}@Overridepublic TextField createTextField() {return new SummerTextField();}
}// 客户端
public class Client {public static void main(String[] args) {// 创建Spring皮肤工厂SkinFactory springFactory = new SpringSkinFactory();// 创建Spring按钮Button springButton = springFactory.createButton();// 显示Spring按钮springButton.display();// 创建Spring文本框TextField springTextField = springFactory.createTextField();// 显示Spring文本框springTextField.display();// 创建Summer皮肤工厂SkinFactory summerFactory = new SummerSkinFactory();// 创建Summer按钮Button summerButton = summerFactory.createButton();// 显示Summer按钮summerButton.display();// 创建Summer文本框TextField summerTextField = summerFactory.createTextField();// 显示Summer文本框summerTextField.display();}
}
  • 输出结果
显示浅绿色按钮
显示浅绿色文本框
显示浅蓝色按钮
显示浅蓝色文本框

建造者模式

建造者模式是一种创建型设计模式,它将一个复杂对象的构建过程和其表示分离开来,从而可以使同样的构建过程可以创建不同的表示。建造者模式的关键是将构建过程分解成多个步骤,并提供一个指导者(Director)来组织这些步骤的执行,以构建出不同的对象表示。

  • 结构

    1. 产品(Product):表示被构建的复杂对象。产品类通常包含多个部件,如汽车对象可能包含引擎、车轮、座椅等部件。
    2. 抽象建造者(Builder):定义了构建产品各个部件的抽象方法,并提供了一个用于返回最终产品的方法。抽象建造者通常是一个接口或者抽象类。
    3. 具体建造者(Concrete Builder):实现了抽象建造者接口,负责构建产品的各个部件,并实现了返回最终产品的方法。
    4. 指导者(Director):负责组织构建过程,根据具体的构建者来指导构建过程的顺序和方法,最终构建出产品。
  • 场景

    1. 需要构建复杂对象:当需要构建复杂对象,且构建过程比较复杂时,可以使用建造者模式。
    2. 需要构建多个表示:当需要通过同样的构建过程创建不同的表示时,可以使用建造者模式。
  • 优点

    1. 分离构建过程和表示:建造者模式将构建过程和最终产品的表示分离开来,使得可以灵活地组合构建过程和表示。
    2. 复用性:建造者模式可以通过不同的建造者来创建不同的产品,提高了代码的复用性。
    3. 更好的封装性:建造者模式将产品的构建过程封装在具体建造者中,使得客户端无需了解产品的具体构建过程。
  • 缺点

    1. 增加了代码量:建造者模式引入了多个新的类,可能会增加系统的复杂性和代码量。
    2. 不适合构建较简单的对象:当产品对象较简单,且构建过程相对固定时,使用建造者模式可能会显得繁琐。
  • 示例

// 产品类 - 汽车
class Car {private String brand; // 品牌private String model; // 型号private String color; // 颜色public Car(String brand, String model, String color) {this.brand = brand;this.model = model;this.color = color;}public String getBrand() {return brand;}public String getModel() {return model;}public String getColor() {return color;}@Overridepublic String toString() {return "Car{" +"brand='" + brand + '\'' +", model='" + model + '\'' +", color='" + color + '\'' +'}';}
}// 抽象建造者接口
interface CarBuilder {void buildBrand(String brand); // 建造品牌void buildModel(String model); // 建造型号void buildColor(String color); // 建造颜色Car getResult(); // 获取结果
}// 具体建造者 - 奥迪汽车建造者
class AudiCarBuilder implements CarBuilder {private Car car;public AudiCarBuilder() {car = new Car("Audi", "", "");}@Overridepublic void buildBrand(String brand) {car = new Car("Audi", "", "");}@Overridepublic void buildModel(String model) {car = new Car(car.getBrand(), model, "");}@Overridepublic void buildColor(String color) {car = new Car(car.getBrand(), car.getModel(), color);}@Overridepublic Car getResult() {return car;}
}// 指导者 - 汽车销售员
class CarSalesman {private CarBuilder carBuilder;public void setCarBuilder(CarBuilder carBuilder) {this.carBuilder = carBuilder;}public Car constructCar() {carBuilder.buildBrand("Audi"); // 建造品牌carBuilder.buildModel("A4"); // 建造型号carBuilder.buildColor("Black"); // 建造颜色return carBuilder.getResult(); // 获取结果}
}public class BuilderPatternExample {public static void main(String[] args) {CarBuilder audiCarBuilder = new AudiCarBuilder();CarSalesman carSalesman = new CarSalesman();carSalesman.setCarBuilder(audiCarBuilder);Car car = carSalesman.constructCar();System.out.println(car);}
}
  • 输出结果
Car{brand='Audi', model='A4', color='Black'}

原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,它用于创建对象的克隆,而不是通过实例化来创建新对象。原型模式通过复制现有对象来创建新对象,从而避免了耗时的实例化过程。

  • 结构

    1. 原型接口:定义了一个可以克隆自身的方法。
    2. 具体原型类:实现了原型接口,提供了克隆自身的方法。
    3. 客户端:通过调用具体原型类的克隆方法来获取新的对象。
  • 场景

    1. 对象初始化成本高:当对象的创建过程比较耗时或资源消耗较大时,可以使用原型模式提前创建好对象,然后通过复制来避免重复初始化。
    2. 对象类型不确定:当需要在运行时动态地创建对象,并且不清楚对象的具体类型时,可以使用原型模式。
    3. 复杂对象的复制:当对象包含了其他对象的引用,且需要进行深层次的拷贝时,可以使用原型模式来实现对象的复制。
    4. 保护对象的状态:当需要保护对象的状态不被外部修改时,可以通过克隆来获取对象的副本,从而保护原始对象的状态。
  • 优点

    1. 减少资源消耗:通过复制现有对象来创建新对象,避免了耗时的实例化过程,减少了资源消耗。
    2. 简化对象创建:可以在运行时动态地创建对象,而无需事先知道对象的类型。
    3. 灵活性:可以通过修改原型对象来创建不同类型的对象,或者通过克隆对象来创建多个相似对象。
  • 缺点

    1. 深拷贝问题:原型模式要求对象支持克隆操作,但如果对象中包含了其他对象的引用,克隆操作可能会导致深层次的拷贝问题。
    2. 复杂性:如果对象的复制过程比较复杂,可能会导致代码复杂度增加。
  • 示例

// 实现Cloneable接口,表示可以被克隆
class Shape implements Cloneable {private String type;public String getType() {return type;}public void setType(String type) {this.type = type;}// 重写Object类的clone方法,实现浅拷贝@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}
}// 具体原型类:圆形
class Circle extends Shape {public Circle() {setType("圆形");}
}// 具体原型类:正方形
class Square extends Shape {public Square() {setType("正方形");}
}// 客户端
public class Client {public static void main(String[] args) {// 创建圆形对象Circle circle = new Circle();try {// 克隆圆形对象Circle clonedCircle = (Circle) circle.clone();System.out.println("原型对象:" + circle.getType());System.out.println("克隆对象:" + clonedCircle.getType());} catch (CloneNotSupportedException e) {e.printStackTrace();}// 创建正方形对象Square square = new Square();try {// 克隆正方形对象Square clonedSquare = (Square) square.clone();System.out.println("原型对象:" + square.getType());System.out.println("克隆对象:" + clonedSquare.getType());} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}
  • 输出结果
原型对象:圆形
克隆对象:圆形
原型对象:正方形
克隆对象:正方形

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

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

相关文章

Typora for Mac:轻量级Markdown编辑器

Typora for Mac是一款专为Mac用户设计的轻量级Markdown编辑器,它以其简洁的界面和强大的功能,成为了Markdown写作爱好者的首选工具。 Typora for Mac v1.8.10中文激活版下载 Typora的最大特色在于其所见即所得的编辑模式,用户无需关心复杂的M…

为什么 Facebook 不使用 Git?

在编程的世界里,Git 就像水一样常见,以至于我们认为它是创建和管理代码更改的唯一可行的工具。 前 Facebook 员工,2024 年 首先,我为什么关心? 我致力于构建 Graphite,它从根本上受到 Facebook 内部工具的…

Java | Leetcode Java题解之第52题N皇后II

题目&#xff1a; 题解&#xff1a; class Solution {public int totalNQueens(int n) {Set<Integer> columns new HashSet<Integer>();Set<Integer> diagonals1 new HashSet<Integer>();Set<Integer> diagonals2 new HashSet<Integer>…

【Diffusion实战】训练一个diffusion模型生成蝴蝶图像(Pytorch代码详解)

上一篇Diffusion实战是确确实实一步一步走的公式&#xff0c;这回采用一个更方便的库&#xff1a;diffusers&#xff0c;来实现Diffusion模型训练。 Diffusion实战篇&#xff1a;   【Diffusion实战】训练一个diffusion模型生成S曲线&#xff08;Pytorch代码详解&#xff09;…

web题目实操 5(备份文件和关于MD5($pass,true)注入的学习)

1.[ACTF2020 新生赛]BackupFile &#xff08;1&#xff09;打开页面后根据提示是备份文件 &#xff08;2&#xff09;查看源码发现啥都没有 &#xff08;3&#xff09;这里啊直接用工具扫描&#xff0c;可以扫描到一个文件名为&#xff1a;/index.php.bak的文件 &#xff08;…

ArcGIS Pro 和 Python — 分析全球主要城市中心的土地覆盖变化

第一步——设置工作环境 1–0. 地理数据库 在下载任何数据之前,我将创建几个地理数据库,在其中保存和存储所有数据以及我将创建的后续图层。将为我要分析的五个城市中的每一个创建一个地理数据库,并将其命名为: “Phoenix.gdb” “Singapore.gdb” “Berlin.gdb” “B…

安卓悬浮窗权限检查

目录 悬浮窗权限代码检测悬浮窗功能 悬浮窗权限 请求了这个权限后&#xff0c;app的权限管理中会有「显示悬浮窗」的权限选项。后面会引导用户去开启这个权限。 <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW" />代码检测悬浮窗功能…

Windows系统下将MySQL数据库表内的数据全量导入Elasticsearch

目录 下载安装Logstash 配置Logstash配置文件 运行配置文件 查看导入结果 使用Logstash将sql数据导入Elasticsearch 下载安装Logstash 官网地址 选择Windows系统&#xff0c;需下载与安装的Elasticsearch相同版本的&#xff0c;下载完成后解压安装包。 配置Logstash配…

贪吃蛇大作战【纯c语言】

如果有看到不懂的地方或者对c语言某些知识忘了的话&#xff0c;可以找我之前的文章哦&#xff01;&#xff01;&#xff01; 个人主页&#xff1a;小八哥向前冲~-CSDN博客 所属专栏&#xff1a;c语言_小八哥向前冲~的博客-CSDN博客 贪吃蛇游戏演示&#xff1a; 贪吃蛇游戏动画演…

第一阶段--Day2--信息安全法律法规、网络安全相关标准

目录 1. 针对信息安全的规定 2. 网络安全相关标准 1. 针对信息安全的规定 《中华人民共和国计算机信息系统安全保护条例》1994年2月18日颁布并实施 中华人民共和国计算机信息系统安全保护条例__增刊20111国务院公报_中国政府网 《中华人民共和国国际联网安全保护管理…

笔记:编写程序,分别采用面向对象和 pyplot 快捷函数的方式绘制正弦曲线 和余弦曲线。 提示:使用 sin()或 cos()函数生成正弦值或余弦值。

文章目录 前言一、面向对象和 pyplot 快捷函数的方式是什么&#xff1f;二、编写代码面向对象的方法&#xff1a;使用 pyplot 快捷函数的方法&#xff1a; 总结 前言 本文将探讨如何使用编程语言编写程序&#xff0c;通过两种不同的方法绘制正弦曲线和余弦曲线。我们将分别采用…

图像处理ASIC设计方法 笔记18 轮廓跟踪算法的硬件加速方案

目录 1排除伪孤立点(断裂链表)方法1 限制链表的长度方法2 增加判断条件排除断裂链表方法3 排除不必要跟踪的轮廓(推荐用这个方法)P129 轮廓跟踪算法的硬件加速方案 1排除伪孤立点(断裂链表) 如果图像中某区域存在相邻像素之间仅有对角连接的部位,则对包围该区域的像素…

SOLIDWORKS Electrical 3D--精准的三维布线

相信很多工程师在实际生产的时候都会遇到线材长度不准确的问题&#xff0c;从而导致线材浪费甚至整根线材报废的问题&#xff0c;这基本都是由于人工测量长度所导致的&#xff0c;因此本次和大家简单介绍一下SOLIDWORKS Electrical 3D布线的功能&#xff0c;Electrical 3D布线能…

伙伴匹配(后端)-- 用户登录

文章目录 登录逻辑设计登录业务代码实现用户登录态如何知道是哪个用户登录了&#xff1f;cookie与session 逻辑删除配置添加TableLogic注解 &#xff08;现在做单机登录&#xff09; 后面修改为redis单点登录 登录逻辑设计 接收参数&#xff1a;用户接账户&#xff0c;密码 请…

【数据标注】使用LabelImg标注YOLO格式的数据(案例演示)

文章目录 LabelImg介绍LabelImg安装LabelImg界面标注常用的快捷键标注前的一些设置案例演示检查YOLO标签中的标注信息是否正确参考文章 LabelImg介绍 LabelImg是目标检测数据标注工具&#xff0c;可以标注两种格式&#xff1a; VOC标签格式&#xff0c;标注的标签存储在xml文…

目标检测——蔬菜杂草数据集

引用 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

架构师系列- 消息中间件(12)-kafka基础

1、应用场景 1.1 kafka场景 Kafka最初是由LinkedIn公司采用Scala语言开发&#xff0c;基于ZooKeeper&#xff0c;现在已经捐献给了Apache基金会。目前Kafka已经定位为一个分布式流式处理平台&#xff0c;它以 高吞吐、可持久化、可水平扩展、支持流处理等多种特性而被广泛应用…

22年全国职业技能大赛——Web Proxy配置(web 代理)

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; 系统服务&#xff08;22年国赛&#xff09;—— web Proxy服务&#xff08;web代理&#xff09;https://myweb.myskillstree.cn/114.html 目录 RouterSrv …

强复购、循环消费:排队复购模式助您在市场中脱颖而出

尊敬的各位读者&#xff0c;今天我很高兴向大家介绍一种新颖而又引人入胜的商业模式——排队复购模式。这个模式因其强大的复购属性和循环消费特性而备受瞩目&#xff0c;被誉为电商领域的新宠儿。 为何要介绍排队复购模式&#xff1f;因为它不仅操作简单、容易引起消费者的兴…

BUUCTF_[BSidesCF 2020]Had a bad day

[BSidesCF 2020]Had a bad day 1.一看题目直接尝试文件包含 2.直接报错&#xff0c;确实是存在文件包含漏洞 http://307b4461-36d6-443f-879a-68803a57f721.node5.buuoj.cn:81/index.php?categoryphp://filter/convert.base64-encode/resourceindex strpos() 函数查找字符串…