【设计模式|上】创建型模式
every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog
0. 前言
设计模式(上):
- 简单工厂模式
- 工厂模式
- 抽象工厂模式
- 建造者模式
- 单例模式
1. 正文
1.1 创建型(Creational Patterns)
1.1.1 简单工厂模式(Simple factory)
说明: 非标准的GoF总结设计的23种设计模式之一,可作为工厂模式的需要解决的问题
'''
simple Factory Method
'''class Shape(object):'''父类'''def draw(self):raise NotImplementedErrorclass Circle(Shape):'''Shape子类'''def draw(self):print('draw circle')class Rectangle(Shape):'''Shape的子类'''def draw(self):print('draw Rectangle')class ShapeFactory(object):'''工厂模式:暴露给用户去调用的,用户可通过该类进行选择Shape的子类进行实例化'''def create(self, shape):if shape == 'Circle':return Circle()elif shape == 'Rectangle':return Rectangle()else:return Nonefac = ShapeFactory() #实例化工厂类
obj = fac.create('Circle') #实例化Shape的Circle子类
obj.draw()
作用: 定义一个用于创建对象的接口,让子类决定实例化哪一个。
场景:
- 当一个类不知道它所必须创建的对象的类的时候
- 当一个类希望由它的子类来指定它所创建对象的时候
- 当类将创建对象的职责委托给多个子类中的某一个
优点: 客户端不需要修改代码。
缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则
1.1.2 工厂方法模式(Factory Method)
案例1:
'''
Factory Method工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。
首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式(Factory Method pattern)是最典型的模板方法模式(Templete Method pattern)应用。
'''class ShapeFactory(object):'''工厂类'''def getShape(self):return self.shape_nameclass Circle(ShapeFactory):def __init__(self):self.shape_name = "Circle"def draw(self):print('draw circle')class Rectangle(ShapeFactory):def __init__(self):self.shape_name = "Retangle"def draw(self):print('draw Rectangle')class ShapeInterfaceFactory(object):'''接口基类'''def create(self):'''把要创建的工厂对象装配进来'''raise NotImplementedErrorclass ShapeCircle(ShapeInterfaceFactory):# 核心在这里def create(self):return Circle()class ShapeRectangle(ShapeInterfaceFactory):# 核心在这里def create(self):return Rectangle()shape_interface = ShapeCircle()
obj = shape_interface.create()
obj.getShape()
obj.draw()shape_interface2 = ShapeRectangle()
obj2 = shape_interface2.create()
obj2.draw()
核心: ShapeInterfaceFactory(父类 or 基类):提取出所有子类的重复方法代码
案例2:
使用步骤:
- 创建抽象工厂类,定义具体工厂的公共接口;
- 创建抽象产品类 ,定义具体产品的公共接口;
- 创建具体产品类(继承抽象产品类) ,定义生产的具体产品;
- 创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法;
- 外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例
# 抽象工厂类
class WeChatFactory(object):def create_wechat(self):pass
# 具体工厂类A(创建账号A)
class AccountAFactory(WeChatFactory):def create_wechat(self):return AccountA()
# 具体工厂类B(创建账号B)
class AccountBFactory(WeChatFactory):def create_wechat(self):return AccountB()
# 抽象产品类(微信账号功能)
class WeChat(object):def send_message(self, content):pass
def send_image(self, imageid):pass
# 具体产品类A(账号A功能)
class AccountA(WeChat):def send_message(self, content):print("使用企业微信账号A推送信息: ", content)
def send_image(self, imageid):print("使用企业微信账号A推送图片: ", imageid)
# 具体产品类B(账号B功能)
class AccountB(WeChat):def send_message(self, content):print("使用企业微信账号B推送信息: ", content)
def send_image(self, imageid):print("使用企业微信账号B推送图片: ", imageid)
if __name__ == "__main__":# 实例化账号Awechat_factory_a = AccountAFactory()# 创建账号A的微信对象wechat1 = wechat_factory_a.create_wechat()# 使用账号A对象发送信息wechat1.send_message(content="haha")wechat1.send_image(imageid="hehe.jpg")
# 实例化账号Bwechat_factory_b = AccountBFactory()# 创建账号B的微信对象wechat2 = wechat_factory_b.create_wechat()# 使用账号B对象发送信息wechat2.send_message(content="heihei")wechat2.send_image(imageid="hehe.jpg")
小结:
有两个类,在类中定义公共接口,在实例化时,一个类中的某一方法作用是实例化另一个类
1.1.3 抽象工厂模式(Abstract Factory)
'''
Abstract Factory
'''class AbstractFactory(object):computer_name = ''def createCpu(self):passdef createMainboard(self):passclass IntelFactory(AbstractFactory):computer_name = 'Intel I7-series computer 'def createCpu(self):return IntelCpu('I7-6500')def createMainboard(self):return IntelMainBoard('Intel-6000')class AmdFactory(AbstractFactory):computer_name = 'Amd 4 computer 'def createCpu(self):return AmdCpu('amd444')def createMainboard(self):return AmdMainBoard('AMD-4000')class AbstractCpu(object):series_name = ''instructions = ''arch=''class IntelCpu(AbstractCpu):def __init__(self,series):self.series_name = seriesclass AmdCpu(AbstractCpu):def __init__(self,series):self.series_name = seriesclass AbstractMainboard(object):series_name = ''class IntelMainBoard(AbstractMainboard):def __init__(self,series):self.series_name = seriesclass AmdMainBoard(AbstractMainboard):def __init__(self,series):self.series_name = seriesclass ComputerEngineer(object):def makeComputer(self,factory_obj):self.prepareHardwares(factory_obj)def prepareHardwares(self,factory_obj):self.cpu = factory_obj.createCpu()self.mainboard = factory_obj.createMainboard()info = '''------- computer [%s] info:cpu: %smainboard: %s-------- End --------'''% (factory_obj.computer_name,self.cpu.series_name,self.mainboard.series_name)print(info)if __name__ == "__main__":engineer = ComputerEngineer() #装机工程师intel_factory = IntelFactory() #intel工厂engineer.makeComputer(intel_factory)amd_factory = AmdFactory() #adm工厂engineer.makeComputer(amd_factory)
- 相比工厂模式,又进了一步,不在工厂中具体实例化类,相当于对工厂进行了抽象。
- 类是对对象的抽象,抽象工厂是对类的抽象。
1.1.4 创建者模式–Builder
解决的问题:
我需要做一个功能,检测出图像中的某些特殊标记。我写了这样一个功能的类,构造它时,传入的是一张拍摄好的图像的fileName。 过了两天,我要把这个功能和其他功能联合起来,我需要的图像就变成了一个数组传入。于是我就加上了一个处理数组数据的构造函数。过了几天,数组又发生了变化,现在图像大小要求可变,没什么难度,新写一个构造函数,包含数组和尺寸。 又过了几天,图像需求又要变了,我之前的图像是三通道的,现在要求,单通道的图像也能处理,嗯,好吧,再加个构造函数。。。。写着写着,我发现上帝也看不懂我的代码了,于是,我就想减少构造函数的复杂度,我找到了Cpp的默认参数的特性,嗯,这样,几个构造函数可以“精巧”的利用默认参数,成功的缩减了构造函数的个数。。。正当我洋洋自得时,情况又变了,有些图像需要特殊的操作,比如强化、锐化或者旋转后,才能使用,为了不影响我类内部的功能实现,我选择在构造时,就可以判断是否需要做特殊操作,于是,我的所有构造函数上就都要加上一个额外的参数—特殊操作参数,ok,我吭哧吭哧的把所有的构造函数都改了,然后,就是函数声明的地方、定义的地方、调用的地方,还记得之前有过的默认参数嘛? 改用这些构造函数,那个酸爽,,,, 每次改之前稳定的代码中的调用的地方,我都要仔细的设计参数,小心翼翼的,改一个,编译一下,跑一下,测试一下结果。 这个时候,发现之前的所谓的“精巧”的设计,简直就是反人类,错一点点都不满足那种精巧了,然后就是铺天盖地的错误。 过了几天,我再回来想看我的代码,发现,脑子里面得把整个思路完全得走一边,才能看懂。没看懂内部逻辑,就别想正确大胆得调用。
事情发展到这个地步,我意识到,我应该去找设计模式了。
来源:https://zhuanlan.zhihu.com/p/58093669 评论
'''
Builder
'''#建造者模式
#相关模式:思路和模板方法模式很像,模板方法是封装算法流程,对某些细节,提供接口由子类修改,建造者模式更为高层一点,将所有细节都交由子类实现。
# 建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
# 基本思想
# 某类产品的构建由很多复杂组件组成;
# 这些组件中的某些细节不同,构建出的产品表象会略有不同;
# 通过一个指挥者按照产品的创建步骤来一步步执行产品的创建;
# 当需要创建不同的产品时,只需要派生一个具体的建造者,重写相应的组件构建方法即可。def printInfo(info):print(info)#建造者基类
class PersonBuilder():def BuildHead(self):passdef BuildBody(self):passdef BuildArm(self):passdef BuildLeg(self):pass#胖子
class PersonFatBuilder(PersonBuilder):type = '胖子'def BuildHead(self):printInfo("构建%s的大。。。。。头" % self.type)def BuildBody(self):printInfo("构建%s的身体" % self.type)def BuildArm(self):printInfo("构建%s的手" % self.type)def BuildLeg(self):printInfo("构建%s的脚" % self.type)#瘦子
class PersonThinBuilder(PersonBuilder):type = '瘦子'def BuildHead(self):printInfo("构建%s的头" % self.type)def BuildBody(self):printInfo("构建%s的身体" % self.type)def BuildArm(self):printInfo("构建%s的手" % self.type)def BuildLeg(self):printInfo("构建%s的脚" % self.type)#指挥者
class PersonDirector():pb = None;def __init__(self, pb):self.pb = pbdef CreatePereson(self):self.pb.BuildHead()self.pb.BuildBody()self.pb.BuildArm()self.pb.BuildLeg()def clientUI():pb = PersonThinBuilder()pd = PersonDirector(pb)pd.CreatePereson()pb2 = PersonFatBuilder()#pd = PersonDirector(pb)pd.pb = pb2pd.CreatePereson()returnif __name__ == '__main__':clientUI();
个人理解: 简单来说就是将需要创建的东西,打包放方法里面,方便统一管理调用
1.1.5 原型模式–Prototype
当创建对象成本较高时使用。如:一个对象需要再操作高代价的数据库之后才被创建,那么可以使用已经创建的对象,减少数据库的调用。
通俗理解:
当我们出版了一本书《大话设计模式 1.0版》,若10 年后我们觉得这本书跟不上时代了,这时候需要去重写一本《大话设计模式 2.0版》,那么我们是完全重写一本书呢?还是在原有《大话设计模式 1.0版》的基础上进行修改呢?当然是后者,这样会省去很多排版、添加原有知识等已经做过的工作。
来源:https://juejin.cn/post/7000534811697741832
'''
Prototype
'''import copyclass Prototype:def __init__(self):self._objects = {}def register_object(self, name, obj):"""Register an object"""self._objects[name] = objdef unregister_object(self, name):"""Unregister an object"""del self._objects[name]def clone(self, name, **attr):"""Clone a registered object and update inner attributes dictionary"""obj = copy.deepcopy(self._objects.get(name))obj.__dict__.update(attr)return objdef main():class A:def __str__(self):return "I am A"a = A()prototype = Prototype()prototype.register_object('a', a)b = prototype.clone('a', a=1, b=2, c=3)print(a)print(b.__dict__)print(b)print(b.a, b.b, b.c)if __name__ == '__main__':main()
1.1.6 单例模式–Singleton
适用场景: 保证只有一个实例操作,用于资源调度、日志管理、信息注册等
'''
Singleton
'''**案例1:** 类方式
# 实现__new__方法
# 并在将一个类的实例绑定到类变量_instance上,
# 如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回
# 如果cls._instance不为None,直接返回cls._instance
class Singleton(object):def __new__(cls, *args, **kwargs):if not hasattr(cls, '_instance'):# cls = a = MyClass('Burgess')# 判断是否有a该实例存在,前面是否已经有人实例过,如果内存没有该实例...往下执行# 需要注明该父类的内存空间内最多允许相同名字子类的实例对象存在1个(不可多个)orig = super(Singleton, cls) # farther classcls._instance = orig.__new__(cls)# orig =让cls继承指定的父类 Singleton# cls._instance = 创建了MyClass('Burgess') 该实例# 这两句相当于外面的 a= MyClass('Burgess')return cls._instance # 具体的实例class MyClass(Singleton):def __init__(self, name):self.name = nameclass Nana(Singleton):def __init__(self, name):self.name = namea = MyClass("Burgess")
print(a.name)
b = MyClass("Crystal")
print(a.name)
print(b.name)
b.name = 'xx'
print(a.name)
print(b.name)
案例2: 装饰器
def singleton(cls, *args, **kw): instances = {} def wrapper(): if cls not in instances: instances[cls] = cls(*args, **kw) return instances[cls] return wrapper
@singleton
class Animal(object):def __init__(self):passanimal1 = Animal()
animal2 = Animal()
print(id(animal1))
print(id(animal2))
参考
[1] https://refactoring.guru/design-patterns/factory-method
[2] https://zhuanlan.zhihu.com/p/322327467
[3] https://zhuanlan.zhihu.com/p/56202148
[4] https://blog.csdn.net/Burgess_zheng/article/details/86762248#t12
[5] https://zhuanlan.zhihu.com/p/105234299
[6] https://blog.csdn.net/qq_33511971/article/details/110168895
[7] https://www.cnblogs.com/littlefivebolg/p/9929016.html
[8] https://blog.csdn.net/qq_30758629/article/details/105842240
[9] https://blog.csdn.net/qq_40329976/article/details/103963327
[10] https://zhuanlan.zhihu.com/p/58093669
[11] https://blog.csdn.net/huxiaotong_exp/article/details/53981963
[12] https://zhuanlan.zhihu.com/p/591683145
[13] https://www.cnblogs.com/welan/p/9123803.html
[14] https://juejin.cn/post/7000534811697741832
[15] https://www.zhihu.com/tardis/zm/art/87524388?source_id=1005
相关文章:
【设计模式|上】创建型模式
every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 设计模式(上): 简单工厂模式工厂模式抽象工厂模式建造者模式单例模式 1. 正文 1.1 创建型(Creational Patterns) …...
【JS】类 class
【JS】类 class 定义类类的方法类继承静态方法 类(class)是用于创建对象的模板。 我们使用 class 关键字来创建一个类,类体在一对大括号 {} 中,我们可以在大括号 {} 中定义类成员的位置,如方法或构造函数。 每个类中…...
Ubuntu安装harbor(http模式)并随便上传一个
Ubuntu安装harbor(http模式) docker和harbor的介绍就免了,都不知道啥东西,还安装搞毛 先安装docker环境 不要问,软件源之类的配置,挨个梭就行 sudo apt update sudo apt install apt-transport-https ca…...
《向量数据库指南》——腾讯云向量数据库Tencent Cloud Vector DB正式上线公测!提供10亿级向量检索能力
8月1日,腾讯云向量数据库(Tencent Cloud Vector DB)已正式上线公测。在腾讯云官网上搜索“向量数据库”,就可以正式体验该产品。 腾讯云向量数据库不仅能为大模型提供外部知识库,提高大模型回答的准确性,还可广泛应用于推荐系统、文本图像检索、自然语言处理等 AI 领域。…...
1分钟解决github push/pull报错443
1.打开https://www.ipaddress.com/ 2.复制如图IP地址 3.文件夹打开C:\Windows\System32\drivers\etc,复制hosts文件,粘贴到桌面 4.在桌面用记事本打开复制过来的hosts 5.在末尾加上一行,IP写刚才复制的 6.复制桌面的hosts,粘贴回C:\Window…...
vue3学习-ref引用
模板引用 使用特殊的 refattribute 允许再特定的Dom或组件被挂在后,获取他的直接引用。 import { ref } form vue const input ref(null) <input ref"input"/>注意:只可以在组件挂载后才能访问模板引用 #如果你需要侦听一个模板引用 r…...
Docker 容器转为镜像
# 容器转成镜像并指定镜像名称与版本号 # commit 时原有容器挂载的目录是不会被写入到新的镜像中去的,数据卷相关的都不会生效 # 但是 root 目录下新建的内容会写入到新的镜像中去 $ docker commit 容器ID 新镜像名称:版本号 $ docker commit -m"描述信息"…...
阿里云服务器免费试用及搭建WordPress网站
文章目录 前言一、免费试用1、选择使用产品2、进行产品配置3、远程连接阿里云服务器①、重置实例密码②、SecureCRT 远程链接③、Workbench 远程链接二、搭建 WordPress 网站1、开放搭建 WordPress 需要的端口2、搭建 LAMP 环境①、Linux 系统升级和更新源②、安装 Apache2③、…...
整流二极管型号汇总,超齐全
整流二极管是什么二极管?查看资料可知,整流二极管是一种将交流电能转变为直流电能的半导体器件,可见整流二极管的作用重在“整流”。整流二极管主要用于各种低频半波整流电路,如需达到全波整流需连成整流桥使用。近日,…...
MongoDB 操作命令
创建database 有就切换没有创建 useMydatabase 显示数据库:show dbs显示该database下的 bson对象 show collections 显示该bson下的具体内容**mydatabase.mycollection.find()**查询该bson对象内容**且查询****mydatabase.mycollection.find({a:,b:})****或查询****…...
markdown高级写作技巧汇总
文章目录 1 代码diff2 待办事项3 图片设置宽高4 折叠5 锚点链接实现方式① Markdown 原始写法 [名称](#id)② HTML 语法 名称 6 目录树7 换行 1 代码diff 如果你做过代码 Code Review,对下面这种效果肯定很熟悉 // 数组去重 const unique (arr)>{ - return A…...
SpringBoot自动配置原理入门级理解
简单理解 spring中,我们配置一个bean有两种方式,一种是xml标签的形式,一种是通过java类的形式。那么自动装配就是通过java类的形式来配置bean。 不同的是,springboot将这些我们需要的bean提前配置好了以java类的形式存放在META-I…...
2023 08.02 小记与展望
碎碎念系列更新 算是坚持的第一个月(每个月更新一次,上次是6.29) 主要对上月工作进行总结,并对后续学习内容进行规划。 一、关于工作 7月工作主要涉及以下方面: 1、公司自研APP维护(主要是接口更新和修改…...
MaxPatrol SIEM 增加了一套检测供应链攻击的专业技术
我们为 MaxPatrol SIEM 信息安全事件监控系统增加了一套新的专业技术。 该产品可帮助企业防范与供应链攻击相关的威胁。 此类攻击正成为攻击者的首要目标:它们以软件开发商和供应商为目标,网络犯罪分子通过他们的产品进入最终目标的基础设施。 因此&a…...
蓝桥杯上岸每日N题 第六期(求阶乘)!!!
蓝桥杯上岸每日N题第六期 ❗️ ❗️ ❗️ 同步收录 👇 蓝桥杯上岸必背!!!(持续更新中~) 大家好 我是寸铁💪 冲刺蓝桥杯省一模板大全来啦 🔥 蓝桥杯4月8号就要开始了 🙏 距离蓝桥杯省赛倒数…...
Codeforces Round 889 (Div. 2)(视频讲解A——D)
文章目录 A Dalton the TeacherB Longest Divisors IntervalC2 Dual (hard Version)D Earn or Unlock Codeforces Round 889 (Div. 2)(视频讲解A——D) A Dalton the Teacher #include<bits/stdc.h> #define endl \n #define INF 0x3f3f3f3f us…...
K8s安全配置:CIS基准与kube-bench工具
01、概述 K8s集群往往会因为配置不当导致存在入侵风险,如K8S组件的未授权访问、容器逃逸和横向攻击等。为了保护K8s集群的安全,我们必须仔细检查安全配置。 CIS Kubernetes基准提供了集群安全配置的最佳实践,主要聚焦在两个方面:主…...
linux安装python和部署Django项目
文章目录 1 python安装2 Django项目部署 1 python安装 官网地址:https://www.python.org/ 本次下载的python安装包地址:https://www.python.org/ftp/python/3.8.16/Python-3.8.16.tgz 解压下载的python压缩包 [rootlocalhost software]# tar -zxvf P…...
00-Hadoop入门
Hadoop入门 Hadoop四高 1)高可靠性 Hadoop底层维护多个数据副本,所有即使hadoop某个计算元素或存储故障,也不会造成数据丢失 2)高扩展性 在集群间分配任务数据,可方便的扩展数以千计的节点 3)高效性 …...
SE-Net注意力机制详解
📌本次任务:了解SE-Net原理 SE-Net 是 ImageNet 2017(ImageNet 收官赛)的冠军模型,是由WMW团队发布。具有复杂度低,参数少和计算量小的优点。且SENet 思路很简单,很容易扩展到已有网络结构如 Inception 和 ResNet 中。(这篇论文是2019年的,应该是后续做了更新) 一…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
