当前位置: 首页 > news >正文

Java八种常见的设计模式

一、单例模式

        单例模式是(Singleton Pattern)Java中最常用的设计模式之一,它保证一个类仅有一个实例,并提供一个全局访问点。

        实现单例模式的核心是将类的构造方法私有化,以防止外部直接通过构造函数创建实例。同时,类内部需要提供一个静态方法或变量来获取该类的唯一实例。单例模式分为饿汉式单例(立即加载)和懒汉式单例(延迟加载)。

饿汉式单例:线程安全

public class Singleton1 {/*** 在类的内部可以访问私有结构,所以可以在类的内部产生实例化对象*/private static Singleton1 instance = new Singleton1();/*** private 声明构造*/private Singleton1() {}/*** 返回对象实例*/public static Singleton1 getInstance() {return instance;}
}

懒汉式单例: 

        当多个线程并发执行 getInstance 方法时,懒汉式会存在线程安全问题,所以用到了 synchronized 来实现线程的同步,当一个线程获得锁的时候其他线程就只能在外等待其执行完毕。而饿汉式则不存在线程安全的问题。

public class Singleton2 {/*线程不安全*/
//    // 指向自己实例的私有静态引用
//    private static Singleton2 singleton2;
//
//    // 私有的构造方法
//    private Singleton2(){}
//
//    // 以自己实例为返回值的静态的公有方法,静态工厂方法
//    public static Singleton2 getSingleton2(){
//        // 被动创建,在真正需要使用时才去创建
//        if (singleton2 == null) {
//            singleton2 = new Singleton2();
//        }
//        return singleton2;
//    }/*** 声明变量*/private static volatile Singleton2 singleton = null;/*** 私有构造方法*/private Singleton2() {}/*** 提供对外方法* @return*/public static Singleton2 getInstance() {// 还未实例化if (singleton == null) {synchronized (Singleton2.class) {if (singleton == null) {singleton = new Singleton2();}}}return singleton;}
}

JDK 中的应用:

  • java.lang.Runtime.getRuntime()
  • java.util.logging.Logger

Spring 中的应用:Spring 的 Bean 默认是单例模式。可以通过 @Scope("prototype") 将其改为多例。

二、工厂模式

根据需求,在用于不同的场景下,创建不同的对象。

public interface Sender {void Send();
}public class MailSender implements Sender{@Overridepublic void Send() {System.out.println("This is mail sender...");}
}public class SmsSender implements Sender{@Overridepublic void Send() {System.out.println("This is sms sender...");}
}public class FactoryPattern {public static void main(String[] args) {Sender sender = produce("mail");sender.Send();}public static Sender produce(String str) {if ("mail".equals(str)) {return new MailSender();} else if ("sms".equals(str)) {return new SmsSender();} else {System.out.println("输入错误...");return null;}}
}

        在此基础上,若存在多个分支判断条件,很容易出现传递的字符串出错,则不能正确创建对象,因此可以多封装一个类,用来将分支判断替换为每个方法,降低耦合,这种模式是多个工厂方法模式,是提供多个工厂方法,分别创建对象。 

public interface Sender {void Send();
}public class MailSender implements Sender{@Overridepublic void Send() {System.out.println("This is mail sender...");}
}public class SmsSender implements Sender{@Overridepublic void Send() {System.out.println("This is sms sender...");}
}public class SendFactory {public Sender produceMail() {return new MailSender();}public Sender produceSms() {return new SmsSender();}
}public class FactoryPattern {public static void main(String[] args) {SendFactory factory = new SendFactory();Sender sender = factory.produceMail();sender.Send();}
}

JDK 中的应用:

  • java.util.Calendar.getInstance()
  • javax.xml.parsers.DocumentBuilderFactory.newInstance()

Spring 中的应用:

  • BeanFactory 和 ApplicationContext 都是工厂模式的体现。

 三、建造者模式

        建造者模式用于创建复杂对象,就是将复杂对象的创建过程拆分成多个简单对象的创建过程,并将这些简单对象组合起来构建出复杂对象。

角色组成:

  1. 产品类(Product):表示被创建的复杂对象。它通常包含多个部分或者组成,并由具体的建造者逐步构建而成。 Meal
  2. 抽象建造者类(Builder):定义了建造复杂对象所需要的各个部分的创建方法。它通常包括多个构建方法和一个返回产品的方法。 MealBuilder
  3. 具体建造者类(ConcreteBuilder):实现Builder接口,并提供各个部分或者组成的构建方法。 BeefBurgerMealBuilder、ChickenMealBuilder、ShrimpMealBuilder
  4. 指挥者类(Director):负责控制建造者的构建顺序,指挥建造者如何构建复杂对象。MealDirector
/*** @Author: EstellaQ* @Date: 2025/4/17 15:43* @Description: 产品类**/
@Data
public class Meal {//汉堡包private String burger;//薯条private String fries;//饮料private String drink;}/*** @Author: EstellaQ* @Date: 2025/4/17 15:44* @Description: 建造者接口**/
public interface MealBuilder {Meal meal=new Meal();//构建汉堡public void buildBurger();//构建薯条public void buildFries();//构建饮料public void buildDrink();public default Meal getMeal(){return meal;}
}/*** @Author: EstellaQ* @Date: 2025/4/17 15:46* @Description:  牛肉套餐建造者**/
public class BeefBurgerMealBuilder implements MealBuilder{@Overridepublic void buildBurger() {meal.setBurger("牛肉汉堡");}@Overridepublic void buildFries() {meal.setFries("大份薯条");}@Overridepublic void buildDrink() {meal.setDrink("中杯可乐");}
}/*** @Author: EstellaQ* @Date: 2025/4/17 15:46* @Description: 鸡肉套餐建造者**/
public class ChickenMealBuilder implements MealBuilder{@Overridepublic void buildBurger() {meal.setBurger("鸡肉汉堡");}@Overridepublic void buildFries() {meal.setFries("中份薯条");}@Overridepublic void buildDrink() {meal.setDrink("大杯果汁");}
}/*** @Author: EstellaQ* @Date: 2025/4/17 15:46* @Description: 虾肉套餐建造者**/
public class ShrimpMealBuilder implements MealBuilder{@Overridepublic void buildBurger() {meal.setBurger("虾肉汉堡");}@Overridepublic void buildFries() {meal.setFries("小份薯条");}@Overridepublic void buildDrink() {meal.setDrink("大杯芬达");}
}/*** @Author: EstellaQ* @Date: 2025/4/17 15:50* @Description: 指挥者**/
public class MealDirector {private MealBuilder mealBuilder;public void setMealBuilder(MealBuilder mealBuilder){this.mealBuilder=mealBuilder;}public Meal getMeal(){return mealBuilder.getMeal();}//制作套餐public void constructMeal(){mealBuilder.buildBurger();mealBuilder.buildFries();mealBuilder.buildDrink();}
}public class BuilderPattern {public static void main(String[] args) {//创建指导者MealDirector director=new MealDirector();//执导建造牛肉套餐director.setMealBuilder(new BeefBurgerMealBuilder());director.constructMeal();Meal meal = director.getMeal();System.out.println("牛肉套餐:"+meal.toString());//鸡肉套餐director.setMealBuilder(new ChickenMealBuilder());director.constructMeal();Meal meal2 = director.getMeal();System.out.println("鸡肉套餐:"+meal2.toString());//虾肉套餐director.setMealBuilder(new ShrimpMealBuilder());director.constructMeal();Meal meal3 = director.getMeal();System.out.println("虾肉套餐:"+meal3.toString());}
}

JDK 中的应用:

  • StringBuilder
  • Stream.Builder

Spring 中的应用:

  • UriComponentsBuilder 用于构建 URI。

 四、 适配器模式

        它允许将不兼容的对象转换成可兼容的接口。主要目的是解决在不改变现有代码的情况下,使不兼容的接口之间能够正常工作,通过创建一个中间转换的适配器来将一个对象转换成我们所需要的接口。

角色组成

  • 目标接口(target):需要适配的标准接口。
  • 源对象(source):需要被适配的不兼容对象。
  • 适配器对象(adapter):充当中间转换角色,该对象将源对象转换成目标接口。
/*** @Author: EstellaQ* @Date: 2025/4/17 16:20* @Description: 目标接口**/
public interface Target {/*** 翻译* @param source 母语* @param target 要翻译成的语种* @param words 内容*/void translate(String source,String target,String words);
}/*** @Author: EstellaQ* @Date: 2025/4/17 16:20* @Description: 源对象**/
public class Translator {//英——》汉public void translateInZh(String words){if("hello world!".equals(words)){System.out.println("翻译成中文:”你好世界!“");}}//汉——》英public void translateInEn(String words){if("你好世界!".equals(words)){System.out.println("Translate in English:”hello world!“");}}
}/*** @Author: EstellaQ* @Date: 2025/4/17 16:21* @Description: 类适配器:通过多重继承目标接口和被适配者类方式来实现适配**/
public class ClassAdapter extends Translator implements Target{@Overridepublic void translate(String source, String target, String words) {if("中文".equals(source) && "英文".equals(target)) {//汉--》英this.translateInEn(words);} else {//英--》汉this.translateInZh(words);}}
}public class AdapterPattern {public static void main(String[] args) {//创建一个类适配器对象ClassAdapter adapter=new ClassAdapter();adapter.translate("中文", "英文", "你好世界!");adapter.translate("英语","中文","hello world!");}
}

 五、 装饰器模式

装饰器模式在不改变原始类的基础上,动态累积扩展其功能。原始对象和装饰类对象都要实现原始对象的接口。

/*** @Author: EstellaQ* @Date: 2025/4/17 16:55* @Description: 原始对象的接口**/
public interface ICoffee {void makeCoffee();
}/*** @Author: EstellaQ* @Date: 2025/4/17 16:56* @Description: 原始对象**/
public class OriginalCoffee implements ICoffee{@Overridepublic void makeCoffee() {System.out.print("原味咖啡 ");}
}/*** @Author: EstellaQ* @Date: 2025/4/17 16:56* @Description: 装饰器基类**/
public abstract class CoffeeDecorator implements  ICoffee{private  ICoffee coffee;public CoffeeDecorator(ICoffee coffee){this.coffee=coffee;}@Overridepublic void makeCoffee() {coffee.makeCoffee();}
}/*** @Author: EstellaQ* @Date: 2025/4/17 16:58* @Description: 加奶的装饰**/
public class MilkDecorator extends CoffeeDecorator{public MilkDecorator(ICoffee coffee) {super(coffee);}@Overridepublic void makeCoffee() {super.makeCoffee();addMilk();}private void addMilk(){System.out.print("加奶 ");}
}/*** @Author: EstellaQ* @Date: 2025/4/17 16:58* @Description: 加糖的装饰**/
public class SugarDecorator extends CoffeeDecorator{public SugarDecorator(ICoffee coffee) {super(coffee);}@Overridepublic void makeCoffee() {super.makeCoffee();addSugar();}private void addSugar(){System.out.print("加糖 ");}
}/*** @Author: EstellaQ* @Date: 2025/4/17 17:00* @Description: 装饰器模式测试**/
public class DecoratorPattern {public static void main(String[] args) {//原味咖啡ICoffee coffee=new OriginalCoffee();coffee.makeCoffee();System.out.println("");//加奶的咖啡coffee=new MilkDecorator(coffee);coffee.makeCoffee();System.out.println("");//先加奶后加糖的咖啡coffee=new SugarDecorator(coffee);coffee.makeCoffee();}
}

JDK 中的应用:

  • java.io.BufferedInputStream 和 java.io.BufferedOutputStream

Spring 中的应用:

  • BeanPostProcessor 用于动态修改 Bean 的行为。

六、 代理模式

        代理模式的结构比较简单,主要是通过定义一个继承抽象主题的代理来包含真实主题,从而实现对真实主题的访问,下面来分析其基本结构。

角色组成:

  • 抽象主题(Subject)类(业务接口类):通过接口或抽象类声明真实主题和代理对象实现的业务方法,服务端需要实现该方法。
  • 真实主题(Real Subject)类(业务实现类):实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
  • 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

静态代理 

        静态代理服务于单个接口,我们来考虑实际工程中的一个例子,现在已经有业务代码实现一个增删功能,原有的业务代码由于仍有大量程序无法改变,现在新增需求,即以后每执行一个方法输出一个日志。

/*** @Author: EstellaQ* @Date: 2025/4/17 17:38* @Description: 业务接口**/
public interface DateService {void add();void del();
}/*** @Author: EstellaQ* @Date: 2025/4/17 17:39* @Description: 委托类**/
public class DateServiceImplA implements DateService{@Overridepublic void add() {System.out.println("成功添加!");}@Overridepublic void del() {System.out.println("成功删除!");}
}/*** @Author: EstellaQ* @Date: 2025/4/17 17:40* @Description: 代理类**/
public class DateServiceProxy implements DateService{DateServiceImplA server = new DateServiceImplA();@Overridepublic void add() {server.add();System.out.println("程序执行add方法,记录日志.");}@Overridepublic void del() {server.del();System.out.println("程序执行del方法,记录日志.");}
}/*** @Author: EstellaQ* @Date: 2025/4/17 17:39* @Description: 代理模式测试**/
public class ProxyPattern {public static void main(String[] args) {DateService service = new DateServiceProxy();service.add();service.del();}
}

动态代理 

        动态代理可以帮助我们仅仅在需要的时候再创建代理类,减少资源浪费,此外由于动态代理是一个模板的形式,也可以减少程序的代码量,例如在静态代码示例中,我们在每个方法中加入System.out.println("程序执行***方法,记录日志.");,当业务方法非常多时,我们也得为每个业务方法加上记录日志的语句,而动态代理中将方法统一管理,无论几个业务方法都只需要一条记录语句即可实现,具体请看代码。

/*** @Author: EstellaQ* @Date: 2025/4/17 17:48* @Description: 动态代理的代理类**/
public class ProxyInvocationHandler implements InvocationHandler {private DateService service;public ProxyInvocationHandler(DateService service) {this.service = service;}public Object getDateServiceProxy() {return Proxy.newProxyInstance(this.getClass().getClassLoader(), service.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {var result = method.invoke(service, args); // 让service调用方法,方法返回值System.out.println(proxy.getClass().getName() + "代理类执行" + method.getName() + "方法,返回" + result +  ",记录日志!");return result;}
}/*** @Author: EstellaQ* @Date: 2025/4/17 17:39* @Description: 代理模式测试**/
public class ProxyPattern {public static void main(String[] args) {
//静态代理
//        DateService service = new DateServiceProxy();
//        service.add();
//        service.del();
//动态代理DateService serviceA = new DateServiceImplA();DateService serviceProxy = (DateService) new ProxyInvocationHandler(serviceA).getDateServiceProxy();serviceProxy.add();serviceProxy.del();}
}

七、 策略模式

        该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。  我认为跟工厂模式的思想很相似    

角色组成:  

抽象策略(Strategy)类
具体策略(Concrete Strategy)类
环境(Context)类

/*** @Author: EstellaQ* @Date: 2025/4/17 18:04* @Description: 抽象算法的策略类,定义所有支持的算法的公共接口**/
public interface Strategy {/*** 算法方法*/public void AlgorithmInterface();
}/*** @Author: EstellaQ* @Date: 2025/4/17 18:04* @Description: 策略实现类A**/
public class ConcreteStrategyA implements Strategy{@Overridepublic void AlgorithmInterface() {System.out.println("算法A的实现");}
}/*** @Author: EstellaQ* @Date: 2025/4/17 18:04* @Description: 策略实现类B**/
public class ConcreteStrategyB implements Strategy{@Overridepublic void AlgorithmInterface() {System.out.println("算法B的实现");}
}/*** @Author: EstellaQ* @Date: 2025/4/17 18:04* @Description: 策略实现类C**/
public class ConcreteStrategyC implements Strategy{@Overridepublic void AlgorithmInterface() {System.out.println("算法C的实现");}
}/*** @Author: EstellaQ* @Date: 2025/4/17 18:06* @Description: 上下文,维护一个对策略类对象的引用**/
public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void contextInterface(){strategy.AlgorithmInterface();}
}/*** @Author: EstellaQ* @Date: 2025/4/17 18:03* @Description: 策略模式的测试类**/
public class StrategyPattern {public static void main(String[] args) {Context context;context = new Context(new ConcreteStrategyA());context.contextInterface();context = new Context(new ConcreteStrategyB());context.contextInterface();context = new Context(new ConcreteStrategyC());context.contextInterface();}
}

JDK 中的应用:

  • java.util.Comparator 是典型的策略模式。

Spring 中的应用:

  • 事务管理(TransactionManager),支持编程式和声明式事务。

八、 观察者模式

        观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。

角色组成:

  • 主题(Subject):也称为被观察者或可观察者,它是具有状态的对象,并维护着一个观察者列表。主题提供了添加、删除和通知观察者的方法。
  • 观察者(Observer):观察者是接收主题通知的对象。观察者需要实现一个更新方法,当收到主题的通知时,调用该方法进行更新操作。
  • 具体主题(Concrete Subject):具体主题是主题的具体实现类。它维护着观察者列表,并在状态发生改变时通知观察者。
  • 具体观察者(Concrete Observer):具体观察者是观察者的具体实现类。它实现了更新方法,定义了在收到主题通知时需要执行的具体操作。
/*** @Author: EstellaQ* @Date: 2025/4/17 18:42* @Description: 主题类,被观察者**/
public class Subject {private List<Observer> observers = new ArrayList<Observer>();private int state;public int getState() {return state;}public void setState(int state) {this.state = state;notifyAllObservers();}public void attach(Observer observer){observers.add(observer);}public void notifyAllObservers(){for (Observer observer : observers) {observer.update();}}
}/*** @Author: EstellaQ* @Date: 2025/4/17 18:43* @Description: 被通知者的抽象类**/
public abstract class Observer {protected Subject subject;public abstract void update();}/*** @Author: EstellaQ* @Date: 2025/4/17 18:46* @Description: 被通知者的实现类**/
public class BinaryObserver extends Observer{public BinaryObserver(Subject subject){this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Binary String: "+ Integer.toBinaryString( subject.getState() ) );}
}/*** @Author: EstellaQ* @Date: 2025/4/17 18:46* @Description: 被通知者的实现类**/
public class OctalObserver extends Observer{public OctalObserver(Subject subject){this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Octal String: "+ Integer.toOctalString( subject.getState() ) );}
}/*** @Author: EstellaQ* @Date: 2025/4/17 18:46* @Description: 被通知者的实现类**/
public class HexaObserver extends Observer{public HexaObserver(Subject subject){this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Hex String: "+ Integer.toHexString( subject.getState() ) );}
}/*** @Author: EstellaQ* @Date: 2025/4/17 18:48* @Description: 观察者模式测试**/
public class ObserverPattern {public static void main(String[] args) {Subject subject = new Subject();new HexaObserver(subject);new OctalObserver(subject);new BinaryObserver(subject);System.out.println("First state change: 15");subject.setState(15);System.out.println("Second state change: 10");subject.setState(10);}
}

JDK 中的应用:

  • java.util.Observer 和 java.util.Observable
  • javax.swing.event.ChangeListener

Spring 中的应用:

  • ApplicationEvent 和 ApplicationListener 是典型实现。

相关文章:

Java八种常见的设计模式

一、单例模式 单例模式是&#xff08;Singleton Pattern&#xff09;Java中最常用的设计模式之一&#xff0c;它保证一个类仅有一个实例&#xff0c;并提供一个全局访问点。 实现单例模式的核心是将类的构造方法私有化&#xff0c;以防止外部直接通过构造函数创建实例。同时&am…...

用Prompt 技术【提示词】打造自己的大语言智能体

机器如何按照人类的指令执行任务的探索 机器需具备理解任务叙述的能力&#xff0c;以便能够按照人类的指令执行任务&#xff0c;为机器提供一些范例作为参考&#xff0c;使其能够理解该执行的任务类型。这样的学习方式称为“Instruction learning”&#xff0c;透过精心设计的…...

灵鉴 AI五大核心能力洞穿 “数据黑箱”云取证深度支持8大核心应用

本文关键词&#xff1a;灵鉴AI 、电子数据取证分析AI助手、云取证、DeepSeek大模型 1.灵鉴AI &#xff0c;V1.0深度融合DeepSeek大模型技术&#xff0c;破解行业痛点&#xff0c;5大核心能力&#xff0c;让大模型真正“懂”电子数据分析。 2.LX-A216云取证系统&#xff0c;V2.…...

了解高速设计的信号完整性仿真

高速设计需要精确的信号传输&#xff0c;以确保最佳性能。信号完整性差会导致关键应用中的误码、数据损坏甚至系统故障等问题。介电常数、损耗角正切和插入损耗等因素会显著影响信号质量。通过使用信号完整性仿真&#xff0c;您可以及早发现并解决这些挑战。这种主动方法有助于…...

用 Deepseek 写的html油耗计算器

在油价高企的今天&#xff0c;了解自己爱车的真实油耗情况对每位车主来说都至关重要。本文将介绍一个简单实用的油耗计算方法&#xff0c;并提供一个可以直接使用的HTML油耗计算器。 为什么要计算油耗&#xff1f; 计算油耗不仅能帮助我们&#xff1a; 了解车辆的真实燃油经济…...

SAP系统青果糖无法报工

问题:班长说工单号4100000101青果糖工单 无法报工 原因排查:工单4100000101的工艺路线版本错误,选了版本1的,版本1是委外的工艺,本厂生产应该选版本2. 解决&#xff1a; 1&#xff1a;重读主数据,更改工单4100000101的工艺路线版本. 2&#xff1a;工单成品已交库,不能直接更改工…...

GPU 招投标全流程分析与总结

GPU 招投标全流程分析与总结 招投标流程概述 以下是通过代理商采购Nvidia H20-GPU 141G的招投标全流程分析: #mermaid-svg-hMPPfkCpGj8GKXfV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hMPPfkCpGj8GKXfV .er…...

Centos7.6安装JDK 1.8教程

前提&#xff1a;先把jdk1.8文件上传到usr/local目录下&#xff0c;文件名如&#xff1a;jdk-8u151-linux-x64.tar.gz 1. 解压 JDK 压缩包 假设 jdk-8u151-linux-x64.tar.gz 文件位于 /usr/local 目录下。 进入 /usr/local 目录&#xff1a; cd /usr/local 解压文件&#…...

Golang errors 包快速上手

文章目录 1.变量2.类型3.函数3.1 New3.2 Is简介函数签名核心功能示例代码使用场景注意事项小结 3.3 As简介函数签名核心功能示例代码使用场景注意事项小结 3.4 Unwrap简介函数签名核心功能使用示例使用场景注意事项小结 3.5 Join简介函数签名核心功能使用场景注意事项小结 4.小…...

新型多机器人协作运输系统,轻松应对复杂路面

受到鱼类、鸟类和蚂蚁等微小生物体协作操纵的启发&#xff0c;研究人员开发了多机器人协作运输系统&#xff08;Multirobot Cooperative Transportation Systems&#xff0c;MRCTS&#xff09;运输单个机器人无法处理的重型超大物体&#xff0c;可用于搜救行动、灾难响应、军事…...

易境通国际货代系统:如何解决货代物流行业的棘手难题

国际货代行业作为全球贸易的重要纽带&#xff0c;面临着日益复杂的市场环境和客户需求。然而&#xff0c;随着业务规模的扩张和多变的市场需求&#xff0c;传统的粗放式管理模式逐渐暴露出效率低下、成本失控、风险难控等问题。尤其在跨境电商高速发展的背景下&#xff0c;货代…...

基于springboot医药连锁店管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 当今社会已经步入了科学技术进步和经济社会快速发展的新时期&#xff0c;国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统医药连锁店管理采取了人工的管理方法&…...

Vue 3 reactive 和 ref 区别及 失去响应性问题

在 Vue 3 中&#xff0c;reactive 和 ref 是实现响应式数据的两个核心 API&#xff0c;它们的设计目标和使用场景有所不同。以下是两者的详细对比&#xff1a; 1. 基本定义与核心功能 特性reactiveref作用创建对象类型的响应式代理&#xff08;对象、数组、Map 等&#xff09…...

d3.js绘制单/多面板组合箱线图

用d3.js研发了个可以单面板、多面板展示的组合箱线图&#xff1b; 组合箱线图中包括普通散点、蜂群散点、小提琴图、小提琴箱线图、柱状图、误差棒、离群点等等&#xff0c;其中大部分你能想到的配置都是自行传参调整的&#xff0c;你想不到的也能稍作修改然后自行调整&#x…...

第二十四天 - 分布式任务队列 - Celery高级应用 - 练习:分布式监控任务系统

一、Celery核心机制解析 1.1 分布式架构四要素 # celery_config.py BROKER_URL redis://:passwordlocalhost:6379/0 # 消息中间件 RESULT_BACKEND redis://:passwordlocalhost:6379/1 # 结果存储 TASK_SERIALIZER json ACCEPT_CONTENT [json] TIMEZONE Asia/Shanghai核…...

IDEA使用jclasslib Bytecode Viewer查看jvm字节码

学习jvm的时候&#xff0c;想查看字节码和局部变量表&#xff0c;可以使用idea安装jclasslib Bytecode View插件查看。 &#xff08;1&#xff09;安装工具&#xff1a; 安装完成后需要重启idea. &#xff08;2&#xff09;准备一段代码&#xff0c;编译运行 package com.te…...

list.

列表类型是用来存储多个有序的字符串&#xff0c;列表中的每个字符串称为元素&#xff08;element&#xff09;&#xff0c;⼀个列表最多可以存储个元素 在 Redis 中&#xff0c;可以对列表两端插入&#xff08;push&#xff09;和弹出&#xff08;pop&#xff09;&#xff0c;…...

202520读书笔记|《我要按自己喜欢的方式去生活》——面对可能到来的裁员,那就等正式通知吧

《我要按自己喜欢的方式去生活》作者宝夏夏&#xff0c;很赞的一本书&#xff0c;通透真实&#xff0c;不矫揉造作&#xff0c;直击内心。 因为第一个故事&#xff0c;裁员而进来的。早晨睡眼惺忪醒来&#xff0c;闺蜜半夜发来一大段话&#xff0c;大意是公司在缩减成本裁员&am…...

Linux 文件传输:系统数据交互的动脉

前言&#xff1a;sshd 在Linux系统中&#xff0c;文件传输常依赖于SSH协议&#xff08;Secure Shell&#xff09;&#xff0c;而sshd&#xff08;OpenSSH Daemon&#xff09;是负责处理SSH连接的后台服务程序。通过sshd&#xff0c;用户可以在加密的通道中进行安全的远程登录、…...

Rust + WebAssembly 生产部署指南

1 最小可行部署&#xff08;MVP&#xff09; 前端打包wasm-pack build --target web --release # 生成 .wasm JS 包装器 npm run build / vite build / webpack … # 打包 HTML/CSS/JS 资源拷贝产物 到生产服务器的站点目录dist/ ├── index.html ├── pkg…...

git忽略已跟踪的文件/指定文件

在项目开发中&#xff0c;有时候我们并不需要git跟踪所有文件&#xff0c;而是需要忽略掉某些指定的文件或文件夹&#xff0c;怎么操作呢&#xff1f;我们分两种情况讨论&#xff1a; 1. 要忽略的文件之前并未被git跟踪 这种情况常用的方法是在项目的根目录下创建和编辑.gitig…...

基于Django实现的图书分析大屏系统项目

图书分析大屏展示系统项目大纲与启动教程 一、项目概述 图书分析大屏展示系统是一个基于Django框架开发的Web应用&#xff0c;主要用于图书数据的可视化分析与展示。该系统采用MVT&#xff08;Model-View-Template&#xff09;架构模式&#xff0c;结合MySQL数据库&#xff0…...

【OSCP-vulnhub】GoldenEye

目录 端口扫描 查找源代码 目录扫描 POP3邮件枚举 1.先枚举用户名 2.hydra爆破 3.nc连接 boris&#xff1a; natalya&#xff1a; 设置本地hosts文件 doak&#xff1a; 解析图片 exiftool for-007.jpg strings for-007.jpg 使用MSF去搜索内核版本 漏洞利用 ---…...

OpenAI发布GPT-4.1系列模型,主打编程能力提升

OpenAI在本周一推出了全新一代模型家族——GPT-4.1系列。没错&#xff0c;就是“4.1”&#xff0c;尽管OpenAI的命名方式已经让人有些摸不着头脑。 这一系列包括三个型号&#xff1a;GPT-4.1、GPT-4.1 mini和GPT-4.1 nano。据OpenAI介绍&#xff0c;这些模型在编程任务和指令遵…...

压缩包网页预览(zip-html-preview)

zip-html-preview 项目介绍 这是一个基于 Spring Boot 开发的在线 ZIP 文件预览工具,主要用于预览 ZIP 压缩包中的 HTML 文件及其相关资源。 主要功能 支持拖拽上传或点击选择多个 ZIP 文件自动解压并提取 ZIP 文件中的 HTML 文件在线预览 HTML 文件及其相关的 CSS、JavaSc…...

OpenCV 图形API(41)颜色空间转换----- BGR 图像转换为灰度图像函数BGR2Gray()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从BGR色彩空间转换为灰度。 B、G和R通道值的传统范围是0到255。结果的灰度颜色值计算为&#xff1a; dst ( I ) 0.114 ∗ src ( I ) . B…...

影视产业链中的律师角色以及合规风控要点

影视产业链中的律师角色以及合规风控要点 在影视娱乐业务中&#xff0c;律师服务贯穿项目全生命周期&#xff0c;涵盖创意开发、投z制作、发行传播、艺人管理及争议等多个领域 一、影视项目全流程合同法律事务 ✔️项目开发阶段 剧本合作&#xff1a;剧本委托创作、改编、版权…...

Java工具类——实体类列表写入excel

Java工具类——实体类列表写入excel /*** 将实体类 List 数据写入 Excel 文件* param dataList 实体类对象列表* param filePath Excel 文件路径* param sheetName Sheet 名称* param <T> 泛型类型* throws IOException 文件操作异常* throws IllegalAccessException 反…...

C++23 新预处理器指令详解:#elifdef、#elifndef 和 #warning

文章目录 1. #elifdef 和 #elifndef&#xff1a;更灵活的条件编译1.1 背景与动机1.2 语法与示例示例代码&#xff1a; 1.3 编译器支持 2. #warning&#xff1a;发出编译警告2.1 背景与动机2.2 语法与示例示例代码&#xff1a; 2.3 编译器支持 3. 总结 C23 标准引入了多项改进&a…...

书写API文档的最佳实践[特殊字符]

API文档对于API的可用性和成功至关重要。完善的API文档能显著提高开发者体验&#xff0c;加速采用&#xff0c;并培养强大的开发者社区。反之&#xff0c;糟糕的文档可能导致困惑、挫败感和错误&#xff0c;从而降低采用率。本文将探讨编写清晰、全面、开发者友好的API文档的高…...

【Maven】手动安装依赖到本地仓库

【Maven】手动安装依赖到本地仓库 【一】下载依赖【二】安装 JAR 文件到本地仓库【三】验证安装【四】在项目中使用该依赖【1】注意事项【2】额外提示 【一】下载依赖 登录到中央仓库下载依赖&#xff0c;中央仓库地址&#xff1a;https://mvnrepository.com/ 搜搜你的依赖的a…...

kali下maven 的安装与配置

1、下载 maven 安装包 wget https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz 2、解压 apache-maven-3.9.4-bin.tar.gz tar -zxvf apache-maven-3.9.4-bin.tar.gz 找到文件解压到的位置&#xff0c;由于解压时我们没有指定路径&#x…...

list的模拟实现和反向迭代器的底层

1&#xff1a;list的模拟实现 1&#xff1a;链表的节点 对于list的模拟实现&#xff0c;我们需要先定义一个节点的类可以使用&#xff08;class也可以使用struct&#xff09; // List的节点类 template<class T> struct ListNode {ListNode(const T& val T()){_p…...

OpenHarmony - 小型系统内核(LiteOS-A)(七)

OpenHarmony - 小型系统内核&#xff08;LiteOS-A&#xff09;&#xff08;七&#xff09; 八、文件系统 适配新的文件系统 基本概念 所谓对接VFS层&#xff0c;其实就是指实现VFS层定义的若干接口函数&#xff0c;可根据文件系统的特点和需要适配其中部分接口。一般情况下&…...

四层板的时钟线设计:关键要点与实用策略

在电子电路设计领域&#xff0c;四层板凭借其出色的电气性能和合理的空间布局&#xff0c;广泛应用于各类电子产品中。而时钟线作为系统的 “心跳”&#xff0c;为整个电路提供同步信号&#xff0c;其设计质量直接关系到系统的稳定性、可靠性和性能表现。因此&#xff0c;深入探…...

【TypeScript类型系统解析:一次真实的类型检查修复经历】

TypeScript类型系统解析&#xff1a;一次真实的类型检查修复经历 在最近的管理系统开发过程中&#xff0c;我遇到了一个值得深入探讨的TypeScript类型问题。通过解决这个问题&#xff0c;我更深入地理解了TypeScript的类型系统工作原理&#xff0c;以及如何在Vue项目中正确处理…...

全视通无感护理巡视系统方案及产品,助力医院护士巡视病房到位

传统的护理工作中&#xff0c;护理巡视是一项重要且繁琐的任务。护士们需要根据不同的护理级别&#xff0c;定时对患者进行巡视&#xff0c;并手工填写巡视记录表&#xff0c;登记巡视时间、人员等信息。月末时&#xff0c;还需进行人工数据统计&#xff0c;这一过程不仅效率低…...

初识Redis · 命令、数据结构补充、协议

目录 前言&#xff1a; 数据结构补充 stream geospaital Hyperloglog bitmap bitfield 渐进式遍历命令等 认识Redis客户端及协议 前言&#xff1a; 在前文&#xff0c;我们总览一下&#xff0c;我们已经介绍了什么是Redis&#xff0c;Redis的应用场景是什么&#xff…...

DBA工作常见问题整理

MVCC机制: PostgreSQL的多版本并发控制(MVCC)是其核心特性之一&#xff0c;它允许数据库在高并发环境下保持高性能的同时提供事务隔离。 MVCC通过维护数据的多个版本实现&#xff1a; 读操作不阻塞写操作写操作不阻塞读操作避免使用锁实现并发控制 PostgreSQL的MVCC特点 写时…...

云转型(cloud transformation)——不仅仅是简单的基础设施迁移

李升伟 编译 云转型不仅仅是迁移基础设施&#xff0c;更是重塑企业运营、创新及价值交付的方式。它具有战略性、持续性&#xff0c;并影响着人员、流程和平台。 ☁️ 云转型涉及以下内容&#xff1a; &#x1f504; 应用现代化——从单体架构转向微服务架构。 ⚙️ 运营自动…...

SpringBoot 定时任务

启用定时任务‌ 首先确定需要启用定时任务的SpringBoot类&#xff0c;然后添加注解&#xff08;EnableScheduling&#xff09;以启用定时任务 package com.mt.visitorauth.anjian.service;import org.springframework.scheduling.annotation.EnableScheduling;EnableScheduli…...

常见的低代码策略整理

低代码策略通过简化开发流程、降低技术门槛、提升效率&#xff0c;帮助用户快速构建灵活可靠的应用。这些策略的核心优势体现在以下方面&#xff1a; 快速交付与降本增效 减少编码需求&#xff1a;通过可视化配置&#xff08;如变量替换、表达式函数&#xff09;替代传统编码…...

HFSS(李明洋)学习记录1

Hfss操作记录 HFSS—solution type&#xff1a;选择求解类型Modeler—units&#xff1a;设置hfss内部的基本单位可选mm或者in&#xff08;英寸&#xff09;设置端口激励—波端口&#xff1a;右键selection model/face 选中对应的表面之后&#xff1b;右键assign excitation/po…...

泛目录站群技术架构演进观察:2025年PHP+Java混合方案实战笔记​

https://www.zhanqun.xin/ 在参与某跨国电商平台SEO优化项目时&#xff0c;我们团队对市面上主流站群系统进行了为期半年的技术评估。最终选择部署的2025版无极多功能泛目录站群程序&#xff0c;其技术实现路径与工程化设计思路颇具参考价值&#xff0c;现整理关键发现如下。 …...

sentinel安装部署及测试--实践

一、什么是 Sentinel&#xff1f; Sentinel 是阿里巴巴开源的一款用于微服务流量控制和系统防护的中间件。它的主要功能包括&#xff1a; **流量控制&#xff08;Flow Control&#xff09;&#xff1a;**限制系统的 QPS 或线程数&#xff0c;防止因流量过大导致系统崩溃。 **…...

Yocto项目实战教程 · 第4章:4.1小节元数据

&#x1f50d; B站相应的视频教程&#xff1a; &#x1f4cc; Yocto项目实战教程-第4章-4.1小节-元数据 记得三连&#xff0c;标为原始粉丝。 在嵌入式Linux系统构建中&#xff0c;Yocto项目凭借其高度模块化、可配置的特性成为主流工具。而其背后的关键支撑之一&#xff0c;便…...

应用镜像是什么?轻量应用服务器的镜像大全

应用镜像是轻量应用服务器专属的&#xff0c;镜像就是轻量应用服务器的装机盘&#xff0c;应用镜像在原有的纯净版操作系统上集成了应用程序&#xff0c;例如WordPress应用镜像、宝塔面板应用镜像、WooCommerce等应用&#xff0c;阿里云服务器网aliyunfuwuqi.com整理什么是轻量…...

关于Java集合中对象字段的不同排序实现方式

&#x1f4ca; 关于Java集合中对象字段的不同排序实现方式 #Java集合 #排序算法 #Comparator #性能优化 一、排序基础&#xff1a;两种核心方式对比 方式Comparable接口Comparator接口实现位置目标类内部实现独立类或匿名内部类排序逻辑自然排序&#xff08;固定规则&#xf…...

2000-2017年各省发电量数据

2000-2017年各省发电量数据 1、时间&#xff1a;2000-2017年 2、来源&#xff1a;能源年鉴、国家统计局 3、指标&#xff1a;行政区划代码、城市、年份、发电量 4、范围&#xff1a;31省 5、指标说明&#xff1a;发电量是指在特定时间内&#xff0c;发电设备&#xff08;如…...

第二十二天 - 安全加固实践 - 漏洞扫描工具开发 - 练习:SSH暴力破解防护

前言 随着网络安全威胁日益严峻&#xff0c;掌握基础防护技能成为开发者必备能力。本文将从零开始&#xff0c;通过安全加固实践、漏洞扫描工具开发、SSH暴力破解防护三个维度&#xff0c;带您快速构建安全防御体系。所有示例均附带完整代码&#xff0c;建议边阅读边实践。 一…...