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

设计模式学习(二)

结构型

适配器模式

定义

它允许将一个类的接口转换成客户端期望的另一个接口。适配器模式通常用于使不兼容的接口能够一起工作。

适配器模式的角色
  • 目标接口(Target):客户端期望的接口。
  • 适配者(Adaptee):需要被适配的类或接口。
  • 适配器(Adapter):将适配者的接口转换成目标接口的类。
// 目标接口
interface Printer {void print();
}// 适配者类
class LegacyPrinter {void printDocument() {System.out.println("Legacy Printer is printing a document.");}
}// 适配器类
class LegacyPrinterAdapter implements Printer {private LegacyPrinter legacyPrinter;public LegacyPrinterAdapter(LegacyPrinter legacyPrinter) {this.legacyPrinter = legacyPrinter;}@Overridepublic void print() {legacyPrinter.printDocument();}
}// 客户端代码
public class AdapterPatternExample {public static void main(String[] args) {// 创建适配者对象LegacyPrinter legacyPrinter = new LegacyPrinter();// 创建适配器对象Printer printer = new LegacyPrinterAdapter(legacyPrinter);// 使用适配器调用目标接口的方法printer.print();}
}
jdk或者android系统上的应用
  • jdk

目标接口:List 接口。
适配者:数组(String[])。
适配器:Arrays.asList() 方法返回的 List 实现类。

        // 创建一个数组String[] array = {"Apple", "Banana", "Cherry"};// 使用 Arrays.asList() 将数组适配为 ListList<String> list = Arrays.asList(array);// 现在可以使用 List 的方法操作数组System.out.println(list); // 输出: [Apple, Banana, Cherry]
  • android
    目标接口:RecyclerView.Adapter,定义了如何将数据绑定到 RecyclerView 的视图上。
    适配者:数据源(List)。
    适配器:MyAdapter 类,将数据源适配到 RecyclerView 中。
// 数据类
public class Item {private String name;public Item(String name) {this.name = name;}public String getName() {return name;}
}// 适配器类
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {private List<Item> items;public MyAdapter(List<Item> items) {this.items = items;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {Item item = items.get(position);holder.textView.setText(item.getName());}@Overridepublic int getItemCount() {return items.size();}public static class ViewHolder extends RecyclerView.ViewHolder {public TextView textView;public ViewHolder(View itemView) {super(itemView);textView = itemView.findViewById(R.id.textView);}}
}// 使用适配器
List<Item> items = new ArrayList<>();
items.add(new Item("Apple"));
items.add(new Item("Banana"));
items.add(new Item("Cherry"));RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
MyAdapter adapter = new MyAdapter(items);
recyclerView.setAdapter(adapter);

桥接模式

定义

它将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过提供一个桥接结构,使得抽象和实现可以在不相互影响的情况下进行扩展。

主要角色
  • 抽象类(Abstraction):定义抽象接口,并包含一个对实现类对象的引用。
  • 扩展抽象类(Refined Abstraction):扩展抽象类,通常是对抽象类的具体实现。
  • 实现类接口(Implementor):定义实现类的接口,通常是一个抽象类或接口。
  • 具体实现类(Concrete Implementor):实现实现类接口的具体类。
// 实现类接口:颜色
interface Color {void applyColor();
}
// 具体实现类:红色
class RedColor implements Color {@Overridepublic void applyColor() {System.out.println("Applying red color");}
}// 具体实现类:绿色
class GreenColor implements Color {@Overridepublic void applyColor() {System.out.println("Applying green color");}
}
// 抽象类:形状
abstract class Shape {protected Color color;public Shape(Color color) {this.color = color;}abstract void draw();
}
// 扩展抽象类:圆形
class Circle extends Shape {public Circle(Color color) {super(color);}@Overridevoid draw() {System.out.print("Drawing Circle. ");color.applyColor();}
}// 扩展抽象类:矩形
class Rectangle extends Shape {public Rectangle(Color color) {super(color);}@Overridevoid draw() {System.out.print("Drawing Rectangle. ");color.applyColor();}
}
public class BridgePatternDemo {public static void main(String[] args) {Color red = new RedColor();Color green = new GreenColor();Shape redCircle = new Circle(red);Shape greenRectangle = new Rectangle(green);redCircle.draw();  // 输出: Drawing Circle. Applying red colorgreenRectangle.draw();  // 输出: Drawing Rectangle. Applying green color}
}
jdk或者android系统上的应用

在 Android 中,View 是抽象的 UI 组件,而 Drawable 是具体的绘制实现。View 通过桥接模式与 Drawable 分离,使得 View 可以独立于具体的绘制逻辑。

  • 抽象部分:View 类及其子类(如 Button、TextView)。
  • 实现部分:Drawable 类及其子类(如 BitmapDrawable、ShapeDrawable)。
// 抽象部分
Button button = new Button(context);// 实现部分(Drawable 是具体的绘制实现)
Drawable background = new ColorDrawable(Color.RED);
button.setBackground(background);

组合模式(Composite)

定义

将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以统一对待单个对象和组合对象。

主要角色
  • 组件(Component):定义所有对象的通用接口,可以是抽象类或接口。
  • 叶子节点(Leaf):表示树形结构中的叶子节点,没有子节点。
  • 复合节点(Composite):表示树形结构中的分支节点,包含子节点。
// 组件接口:文件系统组件
interface FileSystemComponent {void showDetails();
}
// 叶子节点:文件
class File implements FileSystemComponent {private String name;public File(String name) {this.name = name;}@Overridepublic void showDetails() {System.out.println("File: " + name);}
}
// 复合节点:文件夹
class Directory implements FileSystemComponent {private String name;private List<FileSystemComponent> components = new ArrayList<>();public Directory(String name) {this.name = name;}public void addComponent(FileSystemComponent component) {components.add(component);}public void removeComponent(FileSystemComponent component) {components.remove(component);}@Overridepublic void showDetails() {System.out.println("Directory: " + name);for (FileSystemComponent component : components) {component.showDetails();}}
}
public class CompositePatternDemo {public static void main(String[] args) {// 创建文件FileSystemComponent file1 = new File("file1.txt");FileSystemComponent file2 = new File("file2.txt");FileSystemComponent file3 = new File("file3.txt");// 创建文件夹Directory dir1 = new Directory("Dir1");Directory dir2 = new Directory("Dir2");// 将文件添加到文件夹dir1.addComponent(file1);dir1.addComponent(file2);dir2.addComponent(file3);// 将文件夹添加到另一个文件夹Directory rootDir = new Directory("Root");rootDir.addComponent(dir1);rootDir.addComponent(dir2);// 显示文件系统结构rootDir.showDetails();}
}
jdk或者android系统上的应用

1、在 Java 集合框架中,Map 和 List 的实现类(如 HashMap、ArrayList)可以嵌套使用,形成树形结构。这种嵌套结构可以看作是组合模式的一种应用。

  • 组件(Component):java.util.Map 或 java.util.List。
  • 叶子节点(Leaf):具体的键值对或列表项。
  • 复合节点(Composite):嵌套的 Map 或 List。
// 复合节点
Map<String, Object> root = new HashMap<>();// 叶子节点
root.put("name", "John Doe");// 嵌套的复合节点
Map<String, Object> address = new HashMap<>();
address.put("city", "New York");
address.put("zip", "10001");// 将嵌套的复合节点添加到根节点
root.put("address", address);System.out.println(root);

2、在 Android 的 UI 框架中,View 和 ViewGroup 是组合模式的典型应用。

  • 组件(Component):android.view.View 是所有 UI 组件的基类。
  • 叶子节点(Leaf):如 TextView、Button 等,它们没有子视图。
  • 复合节点(Composite):如 LinearLayout、RelativeLayout 等,它们可以包含其他视图。
// 复合节点
LinearLayout layout = new LinearLayout(context);
layout.setOrientation(LinearLayout.VERTICAL);// 叶子节点
TextView textView = new TextView(context);
textView.setText("Hello, World!");Button button = new Button(context);
button.setText("Click Me");// 将叶子节点添加到复合节点
layout.addView(textView);
layout.addView(button);// 显示 UI
Activity activity = ...;
activity.setContentView(layout);

装饰模式(Decorator)

定义

通过将对象放入包含行为的特殊封装对象中来为原对象动态添加新的行为。装饰模式的核心思想是通过组合而非继承来扩展对象的功能。

  • 组件接口(Component):定义对象的接口,可以是抽象类或接口。
  • 具体组件(Concrete Component):实现组件接口的具体类。
  • 装饰器(Decorator):持有一个组件对象的引用,并实现组件接口。
  • 具体装饰器(Concrete Decorator):扩展装饰器类,添加新的行为。
jdk或者android系统上的应用
  • Java I/O 流
    Java 的 I/O 流是装饰模式的经典应用。InputStream 和 OutputStream 是组件接口,FileInputStream 和 FileOutputStream 是具体组件,而 BufferedInputStream、DataInputStream 等是装饰器。
// 具体组件
InputStream fileInputStream = new FileInputStream("file.txt");// 装饰器:添加缓冲功能
InputStream bufferedInputStream = new BufferedInputStream(fileInputStream);// 装饰器:添加数据读取功能
DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);
  • Android 系统中的装饰模式
    在 Android 中,ContextWrapper 是装饰模式的典型应用。Context 是组件接口,ContextImpl 是具体组件,而 ContextWrapper 是装饰器。
// 具体组件
Context context = new ContextImpl();// 装饰器:ContextWrapper
ContextWrapper contextWrapper = new ContextWrapper(context);

外观模式(Facade)

定义

它提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,使得子系统更容易使用。

主要角色
  • 外观类(Facade):提供一个简单的接口,隐藏子系统的复杂性。
  • 子系统类(Subsystem Classes):实现子系统的功能,处理外观类指派的任务。
// 子系统类:灯光
class Light {public void on() {System.out.println("Light is on");}public void off() {System.out.println("Light is off");}
}// 子系统类:音响系统
class SoundSystem {public void on() {System.out.println("Sound system is on");}public void off() {System.out.println("Sound system is off");}public void setVolume(int level) {System.out.println("Sound system volume set to " + level);}
}// 子系统类:投影仪
class Projector {public void on() {System.out.println("Projector is on");}public void off() {System.out.println("Projector is off");}public void setInput(String input) {System.out.println("Projector input set to " + input);}
}
// 外观类:家庭影院外观
class HomeTheaterFacade {private Light light;private SoundSystem soundSystem;private Projector projector;public HomeTheaterFacade(Light light, SoundSystem soundSystem, Projector projector) {this.light = light;this.soundSystem = soundSystem;this.projector = projector;}public void watchMovie() {System.out.println("Get ready to watch a movie...");light.off();soundSystem.on();soundSystem.setVolume(10);projector.on();projector.setInput("DVD");}public void endMovie() {System.out.println("Shutting down the movie theater...");light.on();soundSystem.off();projector.off();}
}
jdk或者android系统上的应用

在 Android 中,Context 是一个外观类,它提供了一个统一的接口来访问系统资源、启动 Activity、访问文件系统等。

Context context = getApplicationContext();
context.startActivity(new Intent(context, AnotherActivity.class));

享元模式(Flyweight)

定义

它通过共享对象来减少内存使用和提高性能。享元模式的核心思想是将对象的内部状态(Intrinsic State)和外部状态(Extrinsic State)分离,内部状态可以被共享,而外部状态由客户端传递。
享元接口(Flyweight):定义享元对象的接口,通常是一个接口或抽象类。

主要角色
  • 具体享元类(Concrete Flyweight):实现享元接口,包含内部状态。
  • 享元工厂(Flyweight Factory):负责创建和管理享元对象,确保共享。
  • 客户端(Client):使用享元对象,并维护外部状态。

假设我们正在开发一个文本编辑器,需要处理大量的字符对象。每个字符都有固定的内部状态(如字符值、字体等),而外部状态(如位置、颜色等)可能会频繁变化。我们可以使用享元模式来共享字符对象,从而减少内存占用。

// 享元接口:字符
interface Character {void display(String color);
}
// 具体享元类:具体字符
class ConcreteCharacter implements Character {private char value; // 内部状态(字符值)public ConcreteCharacter(char value) {this.value = value;}@Overridepublic void display(String color) {System.out.println("Character: " + value + ", Color: " + color);}
}
import java.util.HashMap;
import java.util.Map;// 享元工厂:字符工厂
class CharacterFactory {private Map<Character, ConcreteCharacter> characters = new HashMap<>();public Character getCharacter(char value) {// 如果字符已经存在,直接返回if (characters.containsKey(value)) {return characters.get(value);}// 否则创建新的字符对象并缓存ConcreteCharacter character = new ConcreteCharacter(value);characters.put(value, character);return character;}
}
public class FlyweightPatternDemo {public static void main(String[] args) {// 创建享元工厂CharacterFactory factory = new CharacterFactory();// 获取字符对象(内部状态共享)Character charA = factory.getCharacter('A');Character charB = factory.getCharacter('B');Character charA2 = factory.getCharacter('A'); // 重复使用 'A'// 显示字符(外部状态由客户端传递)charA.display("Red");charB.display("Blue");charA2.display("Green");// 验证是否共享System.out.println("charA == charA2: " + (charA == charA2)); // 输出 true}
}
jdk或者android系统上的应用
  • Java 字符串常量池
    Java 中的字符串常量池是享元模式的经典应用。相同的字符串字面量会被共享,而不是创建新的对象。
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2); // 输出 true,因为 s1 和 s2 指向同一个对象
  • Android 的 RecyclerView的ViewHolder
    在 Android 的 RecyclerView 中,ViewHolder 的复用机制是享元模式的应用。RecyclerView 会复用已经创建的 ViewHolder,而不是为每个列表项创建新的对象。
@Override
public void onBindViewHolder(ViewHolder holder, int position) {// 复用 ViewHolder,更新外部状态(如数据)holder.bind(data.get(position));
}

代理模式(Proxy)

定义

它为其他对象提供一个代理对象,并由代理对象控制对原对象的访问。代理模式的核心思想是通过引入一个代理对象,在不改变原始类的情况下,增加额外的功能或控制访问。

主要角色
  • 抽象主题(Subject):定义真实主题和代理对象的共同接口。
  • 真实主题(Real Subject):实现抽象主题接口,是代理对象所代表的真实对象。
  • 代理(Proxy):实现抽象主题接口,并持有对真实主题的引用,可以在调用真实主题之前或之后执行额外的操作。

假设我们有一个图片加载器,加载大图片时可能会消耗大量时间和内存。我们可以使用代理模式来实现延迟加载(Lazy Loading),即只有在真正需要时才加载图片。

// 抽象主题:图片接口
interface Image {void display();
}
// 真实主题:真实图片
class RealImage implements Image {private String filename;public RealImage(String filename) {this.filename = filename;loadFromDisk(); // 模拟加载图片}private void loadFromDisk() {System.out.println("Loading image: " + filename);}@Overridepublic void display() {System.out.println("Displaying image: " + filename);}
}
// 代理:代理图片
class ProxyImage implements Image {private String filename;private RealImage realImage; // 持有对真实主题的引用public ProxyImage(String filename) {this.filename = filename;}@Overridepublic void display() {// 延迟加载:只有在真正需要时才创建真实对象if (realImage == null) {realImage = new RealImage(filename);}realImage.display();}
}
public class ProxyPatternDemo {public static void main(String[] args) {// 创建代理对象Image image = new ProxyImage("large_image.jpg");// 第一次访问:加载图片image.display();System.out.println("------------");// 第二次访问:直接显示图片(无需重新加载)image.display();}
}
jdk或者android系统上的应用
  • 动态代理(java.lang.reflect.Proxy)

Java 提供了动态代理机制,可以在运行时动态创建代理对象。动态代理通常用于实现 AOP(面向切面编程)。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// 抽象主题
interface Service {void doSomething();
}// 真实主题
class RealService implements Service {@Overridepublic void doSomething() {System.out.println("RealService is doing something.");}
}// 动态代理
class DynamicProxy implements InvocationHandler {private Object target;public DynamicProxy(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before method: " + method.getName());Object result = method.invoke(target, args);System.out.println("After method: " + method.getName());return result;}
}public class DynamicProxyDemo {public static void main(String[] args) {// 创建真实主题Service realService = new RealService();// 创建动态代理Service proxyService = (Service) Proxy.newProxyInstance(realService.getClass().getClassLoader(),realService.getClass().getInterfaces(),new DynamicProxy(realService));// 调用代理对象proxyService.doSomething();}
}
  • android Binder
    在 Android 中,Binder 是跨进程通信(IPC)的核心机制。Binder 使用代理模式来实现客户端和服务端的通信。

相关文章:

设计模式学习(二)

结构型 适配器模式 定义 它允许将一个类的接口转换成客户端期望的另一个接口。适配器模式通常用于使不兼容的接口能够一起工作。 适配器模式的角色 目标接口&#xff08;Target&#xff09;&#xff1a;客户端期望的接口。适配者&#xff08;Adaptee&#xff09;&#xff…...

【Docker】快速部署 Nacos 注册中心

【Docker】快速部署 Nacos 注册中心 引言 Nacos 注册中心是一个用于服务发现和配置管理的开源项目。提供了动态服务发现、服务健康检查、动态配置管理和服务管理等功能&#xff0c;帮助开发者更轻松地构建微服务架构。 仓库地址 https://github.com/alibaba/nacos 步骤 拉取…...

大白话讲清楚embedding原理

Embedding&#xff08;嵌入&#xff09;是一种将高维数据&#xff08;如单词、句子、图像等&#xff09;映射到低维连续向量的技术&#xff0c;其核心目的是通过向量表示捕捉数据之间的语义或特征关系。以下从原理、方法和应用三个方面详细解释Embedding的工作原理。 一、Embe…...

pandas中的apply方法使用

apply 用于对 DataFrame 或 Series 中的数据进行逐行或逐列的操作。它可以接受一个函数&#xff08;通常是 lambda 函数或自定义函数&#xff09;&#xff0c;并将该函数应用到每一行或每一列上。apply语法&#xff1a; DataFrame.apply(func, axis0, rawFalse, result_typeNo…...

简单易懂的倒排索引详解

文章目录 简单易懂的倒排索引详解一、引言 简单易懂的倒排索引详解二、倒排索引的基本结构三、倒排索引的构建过程四、使用示例1、Mapper函数2、Reducer函数 五、总结 简单易懂的倒排索引详解 一、引言 倒排索引是一种广泛应用于搜索引擎和大数据处理中的数据结构&#xff0c;…...

Nginx知识

nginx 精简的配置文件 worker_processes 1; # 可以理解为一个内核一个worker # 开多了可能性能不好events {worker_connections 1024; } # 一个 worker 可以创建的连接数 # 1024 代表默认一般不用改http {include mime.types;# 代表引入的配置文件# mime.types 在 ngi…...

CNN的各种知识点(三):有关于VGG16 的结构展开的问题(1)

有关于VGG16 的结构展开的问题&#xff08;1&#xff09; 1. VGG16 的原生结构2. model.avgpool 的作用原生 VGG16 中没有 avgpool 层&#xff1f;代码中的 model.avgpool 是什么&#xff1f; 3. model.classifier 的作用原生 VGG16 的 classifier用户代码中的 classifier 4. 为…...

vue3中el-input无法获得焦点的问题

文章目录 现象两次nextTick()加setTimeout()解决结论 现象 el-input被外层div包裹了&#xff0c;设置autofocus不起作用&#xff1a; <el-dialog v-model"visible" :title"title" :append-to-bodytrue width"50%"><el-form v-model&q…...

sqli-labs靶场通关

sqli-las通关 mysql数据库5.0以上版本有一个自带的数据库叫做information_schema,该数据库下面有两个表一个是tables和columns。tables这个表的table_name字段下面是所有数据库存在的表名。table_schema字段下是所有表名对应的数据库名。columns这个表的colum_name字段下是所有…...

深度学习深度解析:从基础到前沿

引言 深度学习作为人工智能的一个重要分支&#xff0c;通过模拟人脑的神经网络结构来进行数据分析和模式识别。它在图像识别、自然语言处理、语音识别等领域取得了显著成果。本文将深入探讨深度学习的基础知识、主要模型架构以及当前的研究热点和发展趋势。 基础概念与数学原理…...

sobel边缘检测算法

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 Sobel边缘检测算法是一种用于图像处理中的边缘检测方法&#xff0c;它能够突出图像中灰度变化剧烈的地方&#xff0c;也就是边缘。该算法通过计算图像在水平方向和垂直方向上的梯度来检测边缘&#xff0c;梯度值越大…...

LeetCode 349: 两个数组的交集

LeetCode 349: 两个数组的交集 - C语言 问题描述 给定两个数组 ransomNote 和 magazine&#xff0c;你需要判断 ransomNote 是否可以由 magazine 里的字符构成。每个字符可以使用一次。 解题思路 通过统计 magazine 中每个字符的频次&#xff0c;并与 ransomNote 中字符的需…...

MATLAB的数据类型和各类数据类型转化示例

一、MATLAB的数据类型 在MATLAB中 &#xff0c;数据类型是非常重要的概念&#xff0c;因为它们决定了如何存储和操作数据。MATLAB支持数值型、字符型、字符串型、逻辑型、结构体、单元数组、数组和矩阵等多种数据类型。MATLAB 是一种动态类型语言&#xff0c;这意味着变量的数…...

c++ list的front和pop_front的概念和使用案例—第2版

在 C 标准库中&#xff0c;std::list 的 front() 和 pop_front() 是与链表头部元素密切相关的两个成员函数。以下是它们的核心概念和具体使用案例&#xff1a; 1. front() 方法 概念&#xff1a; 功能&#xff1a;返回链表中第一个元素的引用&#xff08;直接访问头部元素&am…...

如何使用SliverList组件

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了沉浸式状态栏相关的内容&#xff0c;本章回中将介绍SliverList组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的SliverList组件是一种列表类组件&#xff0c;类似我们之前介…...

DIFY源码解析

偶然发现Github上某位大佬开源的DIFY源码注释和解析&#xff0c;目前还处于陆续不断更新地更新过程中&#xff0c;为大佬的专业和开源贡献精神点赞。先收藏链接&#xff0c;后续慢慢学习。 相关链接如下&#xff1a; DIFY源码解析...

搜索引擎友好:设计快速收录的网站架构

本文来自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/14.html 为了设计一个搜索引擎友好的网站架构&#xff0c;以实现快速收录&#xff0c;可以从以下几个方面入手&#xff1a; 一、清晰的目录结构与层级 合理划分内容&#xff1a;目录结构应…...

2007-2019年各省科学技术支出数据

2007-2019年各省科学技术支出数据 1、时间&#xff1a;2007-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区名称、年份、科学技术支出 4、范围&#xff1a;31省 5、指标解释&#xff1a;科学技术支出是指为促进科学研究、技术开发…...

【数据分析】案例03:当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib)

当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib) 当当网近30日热销书籍官网写在前面 实验目的:实现当当网近30日热销图书的数据采集与可视化分析。 电脑系统:Windows 使用软件:Visual Studio Code Python版本:python 3.12.4 技术需求:scrapy、…...

DRM系列二:DRM总体介绍

一、简介 DRM&#xff0c;全称Direct Rending Manger。是目前Linux主流的图形显示框架。相比较传统的Framebuffer&#xff08;FB原生不支持多层合成&#xff0c;不支持VSYNC&#xff0c;不支持DMA-BUF&#xff0c;不支持异步更新&#xff0c;不支持fence机制等等&#xff09;&…...

步进电机的型号和分类

步进电机的型号和分类通常根据其尺寸、结构、相数、步距角等参数来区分。以下是一些常见的步进电机型号、分类方法以及如何识别它们的指南&#xff1a; 一、常见步进电机型号 步进电机的型号通常由厂家命名&#xff0c;但也有一些通用的命名规则。以下是一些常见的型号系列&am…...

【力扣】15.三数之和

AC截图 题目 思路 这道题如果简单的用暴力三重遍历去做&#xff0c;会超时。所以我们思考假如有三个下标&#xff0c;i&#xff0c;l&#xff0c;r 其中i0&#xff08;初始&#xff09;&#xff0c;li1 rnums.size()-1 我们固定nums[i]的值&#xff0c;那么就转换为两数之和…...

Redis 基础命令

1. redis 命令官网 https://redis.io/docs/latest/commands/ 2. 在 redis-cli 中使用 help 命令 # 查看 help string 基础命令 keys * # * 代表通配符set key value # 设置键值对del key # 删除键expire key 时间 # 给键设置时间 # -2 代表时间到期了&#xff0c; -1 代表…...

CSES Missing Coin Sum

思路是对数组排序 设 S [ i ] S[i] S[i] 是数组的前缀和 R [ i ] R[i] R[i] 是递增排序后的数组 遍历数组&#xff0c;如果出现 S [ i − 1 ] 1 < R [ i ] S[i - 1] 1 < R[i] S[i−1]1<R[i]&#xff0c;就代表S[i - 1] 1是不能被合成出来的数字 因为&#xff1a…...

Python中的数据类(dataclass):简化类的定义与数据管理

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着Python语言的发展,代码的简洁性与可维护性变得愈发重要。Python 3.7引入的dataclass模块为数据类的定义提供了一种简便而高效的方式,…...

Java线程认识和Object的一些方法ObjectMonitor

专栏系列文章地址&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标&#xff1a; 要对Java线程有整体了解&#xff0c;深入认识到里面的一些方法和Object对象方法的区别。认识到Java对象的ObjectMonitor&#xff0c;这有助于后面的Synchron…...

使用真实 Elasticsearch 进行高级集成测试

作者&#xff1a;来自 Elastic Piotr Przybyl 掌握高级 Elasticsearch 集成测试&#xff1a;更快、更智能、更优化。 在上一篇关于集成测试的文章中&#xff0c;我们介绍了如何通过改变数据初始化策略来缩短依赖于真实 Elasticsearch 的集成测试的执行时间。在本期中&#xff0…...

统计学中的样本概率论中的样本

不知道当初谁想的把概率论和数理统计合并&#xff0c;作为一门课。这本身是可以合并&#xff0c;完整的一条线&#xff0c;看这里。但是&#xff0c;作为任课老师应该从整体上交代清楚&#xff0c;毕竟是两个学科&#xff0c;不同的学科合并必然会有各种不协调的问题。 举个最…...

SQL 总结

SQL 总结 引言 SQL(Structured Query Language)是一种用于管理关系数据库的计算机语言。自从1970年代被发明以来,SQL已经成为了数据库管理的基础。本文将对SQL的基本概念、常用命令、高级特性以及SQL在数据库管理中的应用进行总结。 SQL基本概念 数据库 数据库是存储数…...

Openfga 授权模型搭建

1.根据项目去启动 配置一个 openfga 服务器 先创建一个 config.yaml文件 cd /opt/openFGA/conf touch ./config.yaml 怎么配置&#xff1f; 根据官网来看 openfga/.config-schema.json at main openfga/openfga GitHub 这里讲述详细的每一个配置每一个类型 这些配置有…...

【Proteus】NE555纯硬件实现LED呼吸灯效果,附源文件,效果展示

本文通过NE555定时器芯片和简单的电容充放电电路,设计了一种纯硬件实现的呼吸灯方案,并借助Proteus仿真软件验证其功能。方案无需编程,成本低且易于实现,适合电子爱好者学习PWM(脉宽调制)和定时器电路原理。 一、呼吸灯原理与NE555功能分析 1. 呼吸灯核心原理 呼吸灯的…...

DRM系列三:drm core模块入口

本系列文章基于linux 5.15 一、drm_core_init 执行一些drm core的初始化工作 static int __init drm_core_init(void) {int ret;drm_connector_ida_init();idr_init(&drm_minors_idr);drm_memcpy_init_early();ret drm_sysfs_init();if (ret < 0) {DRM_ERROR("…...

Clock Controller of RH850/F1KH-D8, RH850/F1KM-S4, RH850/F1KM-S2

&esmp; 时钟控制器由时钟振荡电路、时钟选择电路、和时钟输出电路组成。   RH850/F1KH、RH850/F1KM单片机的时钟控制器具有以下特点: 六个片上时钟振荡器: 主振荡器(MainOSC),振荡频率分别为8、16、20和24 MHz子振荡器(SubOSC),振荡频率为32.768 kHz*1 100针的产品…...

kamailio-auth模块详解【以下内容来源于官网,本文只做翻译】

以下是《Auth 模块》文档的中文翻译&#xff1a; Auth 模块 作者&#xff1a;Jan Janak FhG Fokus janiptel.org Juha Heinanen TutPro Inc jhsong.fi Daniel-Constantin Mierla asipto.com micondagmail.com 版权所有 © 2002, 2003 FhG FOKUS 官网链接: https://kamaili…...

从TypeScript到ArkTS的适配指导

文章目录 一、ArkTS语法适配背景程序稳定性程序性能.ets代码兼容性支持与TS/JS的交互方舟运行时兼容TS/JS二、从TypeScript到ArkTS的适配规则概述强制使用静态类型禁止在运行时变更对象布局限制运算符的语义不支持 structural typing约束说明限制使用标准库一、ArkTS语法适配背…...

Git 版本控制:基础介绍与常用操作

目录 Git 的基本概念 Git 安装与配置 Git 常用命令与操作 1. 初始化本地仓库 2. 版本控制工作流程 3. 分支管理 4. 解决冲突 5. 回退和撤销 6. 查看提交日志 前言 在软件开发过程中&#xff0c;开发者常常需要在现有程序的基础上进行修改和扩展。但如果不加以管理&am…...

【Python】理解Python中的协程和生成器:从yield到async

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代编程中,异步编程成为提升程序性能和响应速度的重要手段。Python作为一门功能强大的编程语言,提供了丰富的工具来实现异步操作,其中…...

Unity开发游戏使用XLua的基础

Unity使用Xlua的常用编码方式&#xff0c;做一下记录 1、C#调用lua 1、Lua解析器 private LuaEnv env new LuaEnv();//保持它的唯一性void Start(){env.DoString("print(你好lua)");//env.DoString("require(Main)"); 默认在resources文件夹下面//帮助…...

什么是区块链

区块链是一种去中心化的分布式账本技术&#xff0c;它通过一系列复杂而精密的设计原则和机制来确保数据的安全性、透明性和不可篡改性。在最基础的层面上&#xff0c;区块链是由一系列按照时间顺序链接起来的数据块组成的链式结构。每个数据块中包含了一定数量的交易记录或状态…...

C++中的析构器(Destructor)(也称为析构函数)

在C中&#xff0c;析构器&#xff08;Destructor&#xff09;也称为析构函数&#xff0c;它是一种特殊的成员函数&#xff0c;用于在对象销毁时进行资源清理工作。以下是关于C析构器的详细介绍&#xff1a; 析构函数的特点 名称与类名相同&#xff0c;但前面有一个波浪号 ~&a…...

【ts + java】古玩系统开发总结

src别名的配置 开发中文件和文件的关系会比较复杂&#xff0c;我们需要给src文件夹一个别名吧 vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vitejs.dev/config/ export default defineConfig({pl…...

NLP深度学习 DAY5:Sequence-to-sequence 模型详解

Seq2Seq&#xff08;Sequence-to-Sequence&#xff09;模型是一种用于处理输入和输出均为序列任务的深度学习模型。它最初被设计用于机器翻译&#xff0c;但后来广泛应用于其他任务&#xff0c;如文本摘要、对话系统、语音识别、问答系统等。 核心思想 Seq2Seq 模型的目标是将…...

音视频多媒体编解码器基础-codec

如果要从事编解码多媒体的工作&#xff0c;需要准备哪些更为基础的内容&#xff0c;这里帮你总结完。 因为数据类型不同所以编解码算法不同&#xff0c;分为图像、视频和音频三大类&#xff1b;因为流程不同&#xff0c;可以分为编码和解码两部分&#xff1b;因为编码器实现不…...

数据分析系列--⑦RapidMiner模型评价(基于泰坦尼克号案例含数据集)

一、前提 二、模型评估 1.改造⑥ 2.Cross Validation算子说明 2.1Cross Validation 的作用 2.1.1 模型评估 2.1.2 减少过拟合 2.1.3 数据利用 2.2 Cross Validation 的工作原理 2.2.1 数据分割 2.2.2 迭代训练与测试 ​​​​​​​ 2.2.3 结果汇总 ​​​​​​​ …...

【react+redux】 react使用redux相关内容

首先说一下&#xff0c;文章中所提及的内容都是我自己的个人理解&#xff0c;是我理逻辑的时候&#xff0c;自我说服的方式&#xff0c;如果有问题有补充欢迎在评论区指出。 一、场景描述 为什么在react里面要使用redux&#xff0c;我的理解是因为想要使组件之间的通信更便捷…...

nacos 配置管理、 配置热更新、 动态路由

文章目录 配置管理引入jar包添加 bootstrap.yaml 文件配置在application.yaml 中添加自定义信息nacos 配置信息 配置热更新采用第一种配置根据服务名确定配置文件根据后缀确定配置文件 动态路由DynamicRouteLoaderNacosConfigManagerRouteDefinitionWriter 路由配置 配置管理 …...

前端知识速记:节流与防抖

前端知识速记&#xff1a;节流与防抖 什么是防抖&#xff1f; 防抖是一种控制事件触发频率的方法&#xff0c;通常用于处理用户频繁触发事件的场景。防抖的核心思想是将多个连续触发事件合并为一个事件&#xff0c;以减少执行次数。它在以下场景中特别有效&#xff1a; 输入…...

2.攻防世界PHP2及知识点

进入题目页面如下 意思是你能访问这个网站吗&#xff1f; ctrlu、F12查看源码&#xff0c;什么都没有发现 用kali中的dirsearch扫描根目录 命令如下&#xff0c;根据题目提示以及需要查看源码&#xff0c;扫描以php、phps、html为后缀的文件 dirsearch -u http://61.147.17…...

【ubuntu】双系统ubuntu下一键切换到Windows

ubuntu下一键切换到Windows 1.4.1 重启脚本1.4.2 快捷方式1.4.3 移动快捷方式到系统目录 按前文所述文档&#xff0c;开机默认启动ubuntu。Windows切换到Ubuntu直接重启就行了&#xff0c;而Ubuntu切换到Windows稍微有点麻烦。可编辑切换重启到Windows的快捷方式。 1.4.1 重启…...

C#属性和字段(访问修饰符)

不同点逻辑性/灵活性存储性访问性使用范围安全性属性(Property)源于字段,对字段的扩展,逻辑字段并不占用实际的内存可以被其他类访问对接收的数据范围做限定,外部使用增加了数据的安全性字段(Field)不经过逻辑处理占用内存的空间及位置大部分字段不能直接被访问内存使用不安全 …...