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

《HeadFirst设计模式(第二版)》第六章代码——命令模式

代码文件目录:

Command
package Chapter6_CommandPattern.Command;/*** @Author 竹心* @Date 2023/8/6**/public interface Command {public void execute();public void undo();//撤销该指令
}
CeilingFan
package Chapter6_CommandPattern.ElectricAppliance;/*** @Author 竹心* @Date 2023/8/6**///吊扇
public class CeilingFan {public static final int HIGH = 3;public static final int MEDIUM = 2;public static final int LOW = 1;public static final int OFF = 0;String location;int speed;public CeilingFan(String location){this.location = location;this.speed = OFF;}public void high(){this.speed = HIGH;System.out.println(this.location+" ceilingFan is on High");}public void medium(){this.speed = MEDIUM;System.out.println(this.location+" ceilingFan is on Medium");}public void low(){this.speed = LOW;System.out.println(this.location+" ceilingFan is on Low");}public void off(){this.speed = OFF;System.out.println(this.location+" ceilingFan is on Off");}public int getSpeed(){return this.speed;}}
CeilingFanHighCommand
package Chapter6_CommandPattern.Command;import Chapter6_CommandPattern.ElectricAppliance.CeilingFan;/*** @Author 竹心* @Date 2023/8/6**/public class CeilingFanHighCommand implements Command{CeilingFan ceilingFan;int prevSpeed;//保存上一个挡位public CeilingFanHighCommand(CeilingFan ceilingFan){this.ceilingFan = ceilingFan;}@Overridepublic void execute() {this.prevSpeed = this.ceilingFan.getSpeed();this.ceilingFan.high();}@Overridepublic void undo() {if(this.prevSpeed==CeilingFan.HIGH){this.ceilingFan.high();}else if(this.prevSpeed == CeilingFan.MEDIUM){this.ceilingFan.medium();}else if(this.prevSpeed == CeilingFan.LOW){this.ceilingFan.low();}else if(this.prevSpeed == CeilingFan.OFF){this.ceilingFan.off();}}
}
Light
package Chapter6_CommandPattern.ElectricAppliance;/*** @Author 竹心* @Date 2023/8/6**/public class Light {String name;public Light(String name){this.name = name;}public void on(){System.out.println(this.name+" light is on!");}public void off(){System.out.println(this.name+" light is off!");}
}
LightOnCommand
package Chapter6_CommandPattern.Command;import Chapter6_CommandPattern.Command.Command;
import Chapter6_CommandPattern.ElectricAppliance.Light;/*** @Author 竹心* @Date 2023/8/6**/public class LightOnCommand implements Command {Light light;public LightOnCommand(Light light){this.light = light;}@Overridepublic void execute() {//当遥控器运行这个指令的时候,并不知道灯是如何实现打开开关的//实现遥控器与电器之间的解耦合this.light.on();}@Overridepublic void undo() {this.light.off();}
}
LightOffCommand
package Chapter6_CommandPattern.Command;import Chapter6_CommandPattern.ElectricAppliance.Light;/*** @Author 竹心* @Date 2023/8/6**/public class LightOffCommand implements Command{Light light;public LightOffCommand(Light light){this.light = light;}@Overridepublic void execute() {this.light.off();}public void undo() {this.light.on();}
}
GarageDoor
package Chapter6_CommandPattern.ElectricAppliance;/*** @Author 竹心* @Date 2023/8/6**/public class GarageDoor {Light light;public GarageDoor(Light light){this.light = light;}public void up(){this.lightOn();System.out.println("the garage door is open!");}public void down(){this.lightOff();System.out.println("the garage door is closed");}private void lightOn(){this.light.on();}private void lightOff(){this.light.off();}
}
GarageDoorOpenCommand
package Chapter6_CommandPattern.Command;import Chapter6_CommandPattern.ElectricAppliance.GarageDoor;/*** @Author 竹心* @Date 2023/8/6**/public class GarageDoorOpenCommand implements Command{GarageDoor garageDoor;public GarageDoorOpenCommand(GarageDoor garageDoor){this.garageDoor = garageDoor;}@Overridepublic void execute() {this.garageDoor.up();}public void undo() {this.garageDoor.down();}
}
GarageDoorCloseCommand
package Chapter6_CommandPattern.Command;import Chapter6_CommandPattern.ElectricAppliance.GarageDoor;/*** @Author 竹心* @Date 2023/8/6**/public class GarageDoorCloseCommand implements Command{GarageDoor garageDoor;public GarageDoorCloseCommand(GarageDoor garageDoor){this.garageDoor = garageDoor;}@Overridepublic void execute() {this.garageDoor.down();}public void undo() {this.garageDoor.down();}
}
Stereo
package Chapter6_CommandPattern.ElectricAppliance;/*** @Author 竹心* @Date 2023/8/6**/public class Stereo {int volume;//音响类public void on(){System.out.println("the stereo is on!");}public void off(){System.out.println("the stereo is off!");}public void setCD(){System.out.println("the stereo can work with CD now!");}public void setDVD(){System.out.println("the stereo can work with DVD now!");}public void setVolume(int volume){//设置音量this.volume = volume;}
}
StereoOnWithCDCommand
package Chapter6_CommandPattern.Command;import Chapter6_CommandPattern.ElectricAppliance.Stereo;/*** @Author 竹心* @Date 2023/8/6**/public class StereoOnWithCDCommand implements Command{Stereo stereo;public StereoOnWithCDCommand(Stereo stereo){this.stereo = stereo;}@Overridepublic void execute() {this.stereo.on();this.stereo.setCD();this.stereo.setVolume(6);}@Overridepublic void undo() {this.stereo.off();}
}
StereoOff
package Chapter6_CommandPattern.Command;import Chapter6_CommandPattern.ElectricAppliance.Stereo;/*** @Author 竹心* @Date 2023/8/6**/public class StereoOff implements  Command{Stereo stereo;public StereoOff(Stereo stereo){this.stereo = stereo;}@Overridepublic void execute() {this.stereo.off();}public void undo() {this.stereo.on();this.stereo.setCD();this.stereo.setVolume(6);}
}
MacroCommand
package Chapter6_CommandPattern.Command;/*** @Author 竹心* @Date 2023/8/6**///宏指令
public class MacroCommand implements Command{Command[] commands;public MacroCommand(Command[] commands){this.commands = commands;}@Overridepublic void execute() {for(int i=0;i<this.commands.length;++i){this.commands[i].execute();}}@Overridepublic void undo() {for(int i=0;i<this.commands.length;++i){this.commands[i].undo();}}
}
NoCommand
package Chapter6_CommandPattern.Command;/*** @Author 竹心* @Date 2023/8/6**/public class NoCommand implements Command{@Overridepublic void execute() {//this command is useless!}@Overridepublic void undo() {}
}
RemoteControl
package Chapter6_CommandPattern;import Chapter6_CommandPattern.Command.Command;
import Chapter6_CommandPattern.Command.NoCommand;import java.util.Arrays;/*** @Author 竹心* @Date 2023/8/6**///遥控器类
public class RemoteControl {Command[] onCommands;Command[] offCommands;Command undoCommand;public RemoteControl(){//为简洁起见,这里遥控器只有3个槽位this.onCommands = new Command[7];this.offCommands = new Command[7];Command noCommand = new NoCommand();//这里使用空对象,是为了后面不用写 if(onCommand[i]==null){...}for(int i =0;i<7;++i){this.onCommands[i] = noCommand;this.offCommands[i] = noCommand;}this.undoCommand = noCommand;}//设置某个电器的开关命令public void setCommand(int slot, Command onCommand, Command offCommand){this.onCommands[slot] = onCommand;this.offCommands[slot] = offCommand;}public void onButtonWasPushed(int slot){this.onCommands[slot].execute();this.undoCommand = this.onCommands[slot];}public void offButtonWasPushed(int slot){this.offCommands[slot].execute();this.undoCommand = this.offCommands[slot];}public void undoButtonWasPushed(){this.undoCommand.undo();}@Overridepublic String toString() {StringBuffer stringBuffer = new StringBuffer();stringBuffer.append("\n---------- Remote Control ----------\n");for(int i = 0;i<this.onCommands.length;i++){stringBuffer.append("[slot "+ i +"] "+String.format("%-30s",this.onCommands[i].getClass().getSimpleName())+String.format("%-30s",this.offCommands[i].getClass().getSimpleName())+"\n");}stringBuffer.append("[undo] "+this.undoCommand.getClass().getSimpleName());return stringBuffer.toString();}
}
RemoteLoader
package Chapter6_CommandPattern;import Chapter6_CommandPattern.Command.*;
import Chapter6_CommandPattern.ElectricAppliance.CeilingFan;
import Chapter6_CommandPattern.ElectricAppliance.GarageDoor;
import Chapter6_CommandPattern.ElectricAppliance.Light;
import Chapter6_CommandPattern.ElectricAppliance.Stereo;/*** @Author 竹心* @Date 2023/8/6**/public class RemoteLoader {public static void main(String[] args) {RemoteControl remoteControl = new RemoteControl();//创建设备Light LivingRoomLight = new Light("LivingRoom");Light KitchenLight = new Light("Kitchen");Light GarageLight = new Light("Garage");GarageDoor garageDoor = new GarageDoor(GarageLight);Stereo stereo = new Stereo();//创建命令对象LightOnCommand livingRoomLightOn =new LightOnCommand(LivingRoomLight);LightOnCommand kitchenLightOn = new LightOnCommand(KitchenLight);GarageDoorOpenCommand garageDoorOpenCommand =new GarageDoorOpenCommand(garageDoor);StereoOnWithCDCommand stereoOnWithCDCommand =new StereoOnWithCDCommand(stereo);LightOffCommand lightOffCommand = new LightOffCommand(LivingRoomLight);LightOffCommand kitchenLightOff = new LightOffCommand(KitchenLight);GarageDoorCloseCommand garageDoorCloseCommand =new GarageDoorCloseCommand(garageDoor);StereoOff stereoOff = new StereoOff(stereo);//将命令加载进入槽位remoteControl.setCommand(0,livingRoomLightOn,lightOffCommand);remoteControl.setCommand(1,kitchenLightOn,kitchenLightOff);remoteControl.setCommand(2,garageDoorOpenCommand,garageDoorCloseCommand);remoteControl.setCommand(3,stereoOnWithCDCommand,stereoOff);//展示
//        System.out.println(remoteControl);remoteControl.onButtonWasPushed(0);remoteControl.onButtonWasPushed(1);remoteControl.onButtonWasPushed(2);remoteControl.onButtonWasPushed(3);remoteControl.offButtonWasPushed(0);remoteControl.offButtonWasPushed(1);remoteControl.offButtonWasPushed(2);remoteControl.offButtonWasPushed(3);//使用lambda简洁编写代码//增加撤销按钮后就不能使用了//这样就不用写一大堆命令类了
//        remoteControl.setCommand(4,()->LivingRoomLight.on(),
//                ()->LivingRoomLight.off());//测试撤销功能System.out.println("\n测试撤销:");remoteControl.onButtonWasPushed(0);remoteControl.undoButtonWasPushed();//测试风扇System.out.println("test fan");CeilingFan ceilingFan = new CeilingFan("livingRoom");CeilingFanHighCommand command = new CeilingFanHighCommand(ceilingFan);remoteControl.setCommand(4,command,command);System.out.println(remoteControl);remoteControl.onButtonWasPushed(4);System.out.println(remoteControl);remoteControl.undoButtonWasPushed();//测试宏指令System.out.println("\n宏指令");Light light1 = new Light("Room1");Light light2 = new Light("Room2");Light light3 = new Light("Room3");Light light4 = new Light("Room4");LightOnCommand lightOnCommand1 = new LightOnCommand(light1);LightOnCommand lightOnCommand2 = new LightOnCommand(light2);LightOnCommand lightOnCommand3 = new LightOnCommand(light3);LightOnCommand lightOnCommand4 = new LightOnCommand(light4);LightOffCommand lightOffCommand1 = new LightOffCommand(light1);LightOffCommand lightOffCommand2 = new LightOffCommand(light2);LightOffCommand lightOffCommand3 = new LightOffCommand(light3);LightOffCommand lightOffCommand4 = new LightOffCommand(light4);Command[] onCommands = {lightOnCommand1,lightOnCommand2,lightOnCommand3,lightOnCommand4};Command[] offCommand = {lightOffCommand1,lightOffCommand2,lightOffCommand3,lightOffCommand4};MacroCommand partyOn = new MacroCommand(onCommands);MacroCommand partyOff = new MacroCommand(offCommand);remoteControl.setCommand(5,partyOn,partyOff);System.out.println(remoteControl);remoteControl.onButtonWasPushed(5);remoteControl.offButtonWasPushed(5);remoteControl.undoButtonWasPushed();}
}
SimpleRemoteControl
package Chapter6_CommandPattern;import Chapter6_CommandPattern.Command.Command;/*** @Author 竹心* @Date 2023/8/6**/public class SimpleRemoteControl {Command slot;//目前该遥控器只支持一个槽位public SimpleRemoteControl(){}public void setCommand(Command command){this.slot = command;}public void buttonWasPressed(){this.slot.execute();}}
RemoteControlTest
package Chapter6_CommandPattern;import Chapter6_CommandPattern.Command.GarageDoorOpenCommand;
import Chapter6_CommandPattern.ElectricAppliance.GarageDoor;
import Chapter6_CommandPattern.ElectricAppliance.Light;/*** @Author 竹心* @Date 2023/8/6**/public class RemoteControlTest {public static void main(String[] args) {SimpleRemoteControl remote = new SimpleRemoteControl();Light light = new Light("garage light");GarageDoor garageDoor = new GarageDoor(light);GarageDoorOpenCommand garageDoorOpen = new GarageDoorOpenCommand(garageDoor);remote.setCommand(garageDoorOpen);remote.buttonWasPressed();}
}
notes.txt
命令模式:把请求封装成为对象,以便对不同的请求、队列或者日志请求来参数化对象,并支持可撤销的操作命令对象只暴露一个方法:execute(),命令的请求者不会知道执行者具体如何实现指令当需要将发出请求的对象和能够实行请求的对象解耦合的时候可以使用命令模式

相关文章:

《HeadFirst设计模式(第二版)》第六章代码——命令模式

代码文件目录&#xff1a; Command package Chapter6_CommandPattern.Command;/*** Author 竹心* Date 2023/8/6**/public interface Command {public void execute();public void undo();//撤销该指令 }CeilingFan package Chapter6_CommandPattern.ElectricAppliance;/*** …...

JS 原型与继承2

//***-、原型、原型链、构造函数 prototype、 proto_、constructor function Foo(){this.a1} var foo new Foo(); Object.getPrototypeOf(foo);//访问对象原型 效果等同于&#xff0c;foo. proto &#xff0c;只是更推荐使用 Es6的 Object.getPrototypeof()方式 // construct…...

账号登录相关的一点随笔

最后更新于2023年8月8日 14:25:32 JWT验证&#xff1a; 简单&#xff1a;一个token验证&#xff1b; 前端发来登录信息&#xff0c;后端验证通过后&#xff0c;将token发回前端&#xff1b; 复杂&#xff1a;Access Token Refresh Token验证&#xff1a; 将Access Token和R…...

常见的一些BUG

常见的一些BUG&#xff0c;但实际上在编写代码时&#xff0c;我们应该尽可能避免这些类型的错误&#xff1a; 变量名与函数名冲突&#xff1a; def main(): print("Hello, World!") main 5 print("The value of main is:", main) 函数参数传递错误&…...

ChatGPT在智能社交网络分析和关系挖掘中的应用如何?

智能社交网络分析和关系挖掘是当今信息时代中的重要研究领域&#xff0c;它们通过运用人工智能、机器学习和数据挖掘技术&#xff0c;从社交网络中提取有价值的信息&#xff0c;洞察用户之间的关系和行为模式。ChatGPT作为一种强大的自然语言处理模型&#xff0c;在智能社交网络…...

你不了解的Dictionary和ConcurrentDictionary

最近在做项目时&#xff0c;多线程中使用Dictionary的全局变量时&#xff0c;发现数据并没有存入到Dictionary中&#xff0c;但是程序也没有报错&#xff0c;经过自己的一番排查&#xff0c;发现Dictionary为非线程安全类型&#xff0c;因此我感觉数据没有写进去的原因是多线程…...

c++类模板,嵌套类模板,模板链表,动态数组

c类模板&#xff0c;嵌套类模板&#xff0c;模板链表&#xff0c;动态数组 一.类模板 1.类模板的书写 代码如下 template<typename T>//模板 class CTest {//类 public:T m_a;CTest(const T&a):m_a(a){}void fun1() {cout << typeid(m_a).name() << …...

【Flutter】【基础】CustomPaint 绘画功能,绘制各种图形(二)

CustomPaint 使用实例和代码&#xff1a; 1.canvas.drawColor 绘制背景颜色 class MyPainter1 extends CustomPainter {overridevoid paint(Canvas canvas, Size size) {//绘制背景颜色&#xff0c;整个UI 现在就是红色的canvas.drawColor(Colors.red, BlendMode.srcATop);}…...

YOLOv5修改注意力机制CBAM

直接上干货 CBAM注意力机制是由通道注意力机制&#xff08;channel&#xff09;和空间注意力机制&#xff08;spatial&#xff09;组成。 传统基于卷积神经网络的注意力机制更多的是关注对通道域的分析&#xff0c;局限于考虑特征图通道之间的作用关系。CBAM从 channel 和 sp…...

计算机网络 网络层 概述

...

算法练习--动态规划 相关

文章目录 走方格的方案 走方格的方案 请计算n*m的棋盘格子&#xff08;n为横向的格子数&#xff0c;m为竖向的格子数&#xff09;从棋盘左上角出发沿着边缘线从左上角走到右下角&#xff0c;总共有多少种走法&#xff0c;要求不能走回头路&#xff0c;即&#xff1a;只能往右和…...

JAVA volatile 关键字

volatile 是JAVA虚拟机提供的轻量级的同步机制&#xff0c;有三大特性 1、保证可见性 2、不保证原子性 3、禁止指令重排 JMM JAVA内存模型本身是一种抽象的概念并不真实存在 它描述的是一组规则或规范&#xff0c;提供这组规范定义了程序中各个变量&#xff08;包括实例变…...

[Leetcode] [Tutorial] 回溯

文章目录 46. 全排列Solution 78. 子集Solution 17. 电话号码的字母组合Solution 39. 组合总和Solution 22. 括号生成Solution 46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例&#xff1a; 输入&…...

STM32 CubeMX USB_MSC(存储设备U盘)

STM32 CubeMX STM32 CubeMX USB_MSC(存储设备U盘&#xff09; STM32 CubeMX前言 《使用内部Flash》——U盘一、STM32 CubeMX 设置USB时钟设置USB使能UBS功能选择FATFS功能 二、代码部分修改代码"usbd_storage_if.c"修改代码"user_diskio.c"main函数初始化插…...

湘大 XTU OJ 1214 A+B IV 题解:数位移动的本质+布尔变量标记+朴素模拟

一、链接 AB IV 二、题目 题目描述 小明喜欢做ab的算术&#xff0c;但是他经常忘记把末位对齐&#xff0c;再进行加&#xff0c;所以&#xff0c;经常会算错。 比如1213&#xff0c;他把12左移了1位&#xff0c;结果变成了133。 小明已经算了一些等式&#xff0c;请计算一下…...

以商业大数据技术助力数据合规流通体系建立,合合信息参编《数据经纪从业人员评价规范》团标

经国务院批准&#xff0c;由北京市人民政府、国家发展和改革委员会、工业和信息化部、商务部、国家互联网信息办公室、中国科学技术协会共同主办的2023 全球数字经济大会于近期隆重召开。由数交数据经纪&#xff08;深圳&#xff09;有限公司为主要发起单位&#xff0c;合合信息…...

【论文阅读】Deep Instance Segmentation With Automotive Radar Detection Points

基于汽车雷达检测点的深度实例分割 一个区别&#xff1a; automotive radar 汽车雷达 &#xff1a; 分辨率低&#xff0c;点云稀疏&#xff0c;语义上模糊&#xff0c;不适合直接使用用于密集LiDAR点开发的方法 &#xff1b; 返回的物体图像不如LIDAR精确&#xff0c;可以…...

易服客工作室:如何创建有用的内容日历

利用技巧和工具优化您的内容营销效率和效果。创建一个内容日历&#xff0c;您的整个团队都会从中受益&#xff01; 欢迎来到熙熙攘攘、瞬息万变的内容营销世界&#xff0c;在这里&#xff0c;截止日期到来的速度比喝咖啡的猎豹还要快。 现在&#xff0c;想象一下在没有地图、…...

Excel革命,基于电子表格开发的新工具,不是Access和Power Fx

深谙其道 在日常工作中&#xff0c;Excel是许多人不可或缺的办公工具。 是微软的旗下产品&#xff0c;属于Microsoft 365套件中的一部分&#xff0c;强大的数据处理和计算功能&#xff0c;被普遍应用在全球各行各业的人群当中&#xff0c;是一款强大且普及的电子表格软件。 于…...

“崩溃”漏洞会影响英特尔 CPU 的使用寿命,可能会泄露加密密钥等

对于 CPU 安全漏洞来说&#xff0c;本周是重要的一周。昨天&#xff0c;不同的安全研究人员发布了两个不同漏洞的详细信息&#xff0c;一个影响多代英特尔处理器&#xff0c;另一个影响最新的 AMD CPU。“ Downfall ”和“ Inception ”&#xff08;分别&#xff09;是不同的错…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...