设计模式系列-外观模式
一、上篇回顾
上篇我们主要讲述了创建型模式中的最后一个模式-原型模式,我们主要讲述了原型模式的几类实现方案,和原型模式的应用的场景和特点,原型模式
适合在哪些场景下使用呢?我们先来回顾一下我们上篇讲述的3个常用的场景。
1、我们在运行态的时候,动态的创建一个动态类型的对象的时候,可能我们使用原型模式,可以动态的创建指定类型的副本,这无疑是好的选择,否
则如果通过我们前面讲述的几个创建型模式来实现的话,效率和代价上是非常大的。
2、有的时候我们需要对比一个对象在处理前和处理后进行对象状态的对比,对比是否处理后对象的状态是否发生变化,或者是其他的要求。这个时候
通过原型模式来克隆对象的副本,远比通过引入其他的Factory或者abstract Factory 来的有效和更容易实现。
3、如果我们发现有一类这样的对象,这类对象通常来说比较简单,并且这类对象之间的差别很有规律,并且这类对象数量一般有限,那么这个时候,
我们通过原型模式来做的话,通过一个对象来复制创建其他类型的对象可能比通过引入其他的Factory或者abstract Factory 更容易实现,而且只需要对
象本身提供一个Clone()方法即可。
4、有的时候我们的项目中有这样的情况,我们是在别人的功能的基础上进行扩展,我们有不能修改现有的程序,如果这个应用程序是基于其他类型的
创建型模式,那么如果我们在系统中新增一个类型的时候,我们需要修改统一的创建型模式中的代码,不管是修改配置文件还是具体的功能代码,无疑都是
要修改的,那么如果我们通过原型模式的话,只需要在新增类型的对象内部,提供一个克隆方法即可,完成新对象的创建。
通过上面的情况,那么我们也能大概看出来原型模式的有一个前提,就是必须是基于对象之上调用Clone()方法完成对象的复制,如果没有创建这个对
象的话,可能不能直接使用该方法。
我们也讲述了,对于Clone()对象的时候,深复制和浅复制的情况,还包括通过序列化对象的形式来完成对象的深复制。
二、摘要
本文主要是讲述结构型模式中一个比较常用的模式-外观模式,这个模式呢, 有个最大的特点将细粒度的对象包装成粗粒度的对象 ,应用程序通过
访问这个外观对象,来完成细粒度对象的调用,外观模式一般是分布式应用和系统架构中的应用服务层的设计中常用的方式,并且一般结合外观模式+DTO
来完成服务层的设计,提供分布式应用服务的高效服务,外观模式我们可以这样理解,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具
体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。本文将会从以下几个方面进行讲述:
1、外观模式的使用场景和特点
2、外观模式的实现方案。
3、总结外观模式。
我们这里先给出一个外观模式的原理图:
[外链图片转存中…(img-uEw5sy36-1694043709816)]这是未使用外观模式之前的情况,下面给出使用外观模式后的情形:
通过外观对象来组织细粒度的服务的调用,外观对象提供给外部应用程序可
以使用的服务,而具体的调用细粒度的过程则被外观对象给封装起来,当然这个过程就是封装变化的部分,而将变化的部分与应用程序进行隔离,无疑对程
序的易用性和可维护性都是很大的提高。
三、本文大纲
a、上篇回顾。
b、摘要。
c、本文大纲。
d、外观模式的特点及使用场景。
e、外观模式的实现方案。
f、外观模式使用总结。
g、系列进度。
h、下篇预告。
四、外观模式的特点及使用场景
外观模式的主要思想是将复杂的细粒度的对象服务包装成简单的易使用的粗粒度的功能服务,我们大家最容易理解和知道的外观模式就是,使用的API
接口的封装,我们将第三方的API接口引入到我们的项目中的时候,我们需要对这些接口进行包装,将细粒度的具体调用过程进行包装成外观类的形式,通
过外观类来进行统一的调用。我们平时把一些常用的公共方法也可以简易的称之为外观模式,我们将复杂的细粒度的功能,包装成一个比较通用的简易的的
粗粒度的功能。我们来看看哪些场景下,我们使用外观模式很适合呢?
1、我们在使用第三方类库或者API的时候,我们通过本地的API接口的封装,来完成对第三方API接口的粗粒度外观对象,通过这个外观对象可以很容
易的完成服务的调用。我们这里举例说明吧,例如现在我有一个发送手机短信的API接口,是第三方提供给我的API接口,那么我如何包装呢?
下面给出对API封装的相关代码和说明
public class MessageHelper
{
private static readonly MessageHelper instance = new MessageHelper();#region API接口
[DllImport(“EUCPComm.dll”, EntryPoint = “SendSMS”)] //即时发送
private static extern int SendSMS(string sn, string mn, string ct, string priority);[DllImport(“EUCPComm.dll”, EntryPoint = “SendSMSEx”)] //即时发送(扩展)
private static extern int SendSMSEx(string sn, string mn, string ct, string addi, string priority);[DllImport(“EUCPComm.dll”, EntryPoint = “SendScheSMS”)] // 定时发送
private static extern int SendScheSMS(string sn, string mn, string ct, string ti, string priority);#endregion
#region 对上面的API包装后的方法
public int SendSMSEx1(string sn, string mn, string ct, string addi, string priority)
{
return SendSMSEx(sn, mn, ct, addi, priority);
}public int SendSMS1(string sn, string mn, string ct, string priority)
{
return SendSMS(sn, mn, ct, priority);
}public int SendScheSMS1(string sn, string mn, string ct, string ti, string priority)
{
return SendScheSMS(sn, mn, ct, ti, priority);
}#endregion
}相关的测试代码:
static void Main(string[] args)
{
//相关的测试代码
//调用外观对象中的服务
MessageHelper.instance.SendSMS1(“”, “”, “”, “”);
}2、我们在架构设计的过程中,一次的功能访问可能需要同时的调用很多个对象,那么如果我们在服务调用的时候,能够在应用程序调用中一次就能完
成所有要同时调用的对象那该多好啊,外观模式无疑是最好的原则,特别是在分布式应用中,通过远程调用服务,通过外观模式降低应用程序与服务的交互
次数,同时可以降低应用程序的复杂性。外观模式+DTO,提供远程服务调用的性能,这些都是好的设计方式。我们来看看简单的示例吧,我想我们更
能了解其中的奥妙。看图说话吧,我们这里以一次远程同步服务为例。
未使用外观模式前:
一个简单的同步服务,由于应用程序在这次服务中为了完成同步操作,必须进行3次远程连接来进
行把3个对象进行同步,那么如果我们使用外观对象之后呢,我们只需要访问一次即可完成3个对象的同步。这无疑提高了系统的性能和效率。
[外链图片转存中…(img-uNaCtzwz-1694043709817)]并且通过DTO来进行传输的话,可以提供远程服务调用的访问此时和效率。
五、外观模式的实现方案
5.1 外观模式的经典实现
我们先来看看外观模式的经典实现,我们这里已二进制流序列化服务外观为例来说明下经典实现吧
定义一个二进制序列化外观类:
public class SerializationFacede
{
public string BinarySerializationObjToString(object target)
{
using (MemoryStream stream = new MemoryStream())
{
new BinaryFormatter().Serialize(stream, target);byte[] targetArray = stream.ToArray();
return Convert.ToBase64String(targetArray);
}
}public object DerializationStringToObj(string target)
{
byte[] targetArray = Convert.FromBase64String(target);
using (MemoryStream stream = new MemoryStream(targetArray))
{
return new BinaryFormatter().Deserialize(stream);
}
}public T Derialization(string target)
{
return (T)DerializationStringToObj(target);
}
}我们这里给出相关的测试代码:
static void Main(string[] args)
{
//外观类
SerializationFacede facede = new SerializationFacede();
//测试对象类
Product product = new Product();//序列化对象
string productString= facede.BinarySerializationObjToString(product);
//反序列化对象
product = facede.Derialization(productString);
}通过上面的代码我们可以看出,其实外观类也可以以静态方法的形式来提供,提供一个统一的访问入口,这里可以使用我们前面讲述的单例模式来解决这个
问题。或者提供一个外观对象的创建型工厂来完成创建,而不是通过new()的方式来使用。
我们可以改进一下上面的外观模式,通过定义接口,来解耦客户端程序的调用,通过提供一个接口,客户调用通过接口的形式来调用,无疑就可以解
决这样依赖关系:
我们先来看看接口的定义形式:
///
/// 序列化服务的外观接口
///
public interface ISerializationFace
{
string SerializableToString(object target);object DerializableToObject(string target);
T Derializable(string target);
}我们分别实现SOAP与二进制的形式来实现我们定义的服务外观接口:
二进制序列化服务:
public class BinarySerializationFace : ISerializationFace
{
#region ISerializationFace 成员public string SerializableToString(object target)
{
throw new NotImplementedException();
}public object DerializableToObject(string target)
{
throw new NotImplementedException();
}public T Derializable(string target)
{
throw new NotImplementedException();
}#endregion
}SOAP序列化服务:
public class SoapSerializationFace : ISerializationFace
{
#region ISerializationFace 成员public string SerializableToString(object target)
{
throw new NotImplementedException();
}public object DerializableToObject(string target)
{
throw new NotImplementedException();
}public T Derializable(string target)
{
throw new NotImplementedException();
}#endregion
}测试代码如下:
static void Main(string[] args)
{
//外观类
ISerializationFace facede = new SoapSerializationFace();
//测试对象类
Product product = new Product();//序列化对象
string productString = facede.SerializableToString(product);
//反序列化对象
product = facede.Derializable(productString);
}这样我们就提高了外观模式的灵活性。
5.2、外观模式的其他考虑
5.2.1-传统外观模式的扩展
上面给出的外观模式,我们在具体的测试代码中还是直接通过new()具体的序列化对象的形式,我们这里可以进行改进,通过工厂模式,或者是通过配
置文件的形式来解耦,一般可能外观类不多的情况下,通过配置文件的方式来进行解耦是不错的选择,而不用提供单独的工厂去创建。
我们可以通过如下的形式来改进上面的方案,例如我们的配置文件的格式定义如下:
<?xml version="1.0" encoding="utf-8" ?>那么我们看看序列化工厂带示例代码
public class SerializationFactory
{
public static ISerializationFace Create()
{
//配置文件中读取的Type类型
string type = XMLHelper.GetSectionValue(“”);
return (ISerializationFace)Activator.CreateInstance(Type.GetType(type));
}
}我们来看看具体的测试代码:
static void Main(string[] args)
{
//外观类
ISerializationFace facede = SerializationFactory.Create();
//测试对象类
Product product = new Product();//序列化对象
string productString = facede.SerializableToString(product);
//反序列化对象
product = facede.Derializable(productString);
}
5.2.2-传统外观模式的扩展
下面给我们来看看另外一种形式的外观模式中的DTO+外观模式的实例实现代码
我们看看DTO的形式:
///
/// DTO(数据传输对象),也可以称之为数据载体
///
public class DTO
{private Product _product;
private List _orderList;
//全部都是数据信息或者是其他的引用对象信息
public Product Product
{
get
{
return this._product;
}
set
{
this._product = value;
}
}
public List Product
{
get
{
return this._orderList;
}
set
{
this._orderList = value;
}
}}
具体使用DTO对象的外观类代码如下:
///
/// 远程访问服务
///
public class AccessService
{
bool GetService(DTO dto)
{
return true;
}DTO GetData()
{
return new DTO();
}
}通过这样的简易的方式即可完成服务的访问。
程序的测试代码如下:
static void Main(string[] args)
{
//外观类
AccessService service = new AccessService();DTO dto= service.GetData();
//TODO…
}通过上面的代码,我们完成了最简单的远程外观的访问服务,远程的外观服务还可以通过WCF的形式来完成,由于WCF内置集成了Remoting和
WebService的形式调用,或者是socket的形式。我这里就不详细的介绍了
六、外观模式使用总结
外观模式作为结构型模式中的一个简单又实用的模式,外观模式通过封装细节来提供大粒度的调用,直接的好处就是,封装细节,提供了应用写程序
的可维护性和易用性。外观模式一般应用在系统架构的服务层中,当我们是多个不同类型的客户端应用程序时,比如一个系统既可以在通过Web的形式访
问,也可以通过客户端应用程序的形式时,可能通过外观模式来提供远程服务,让应用程序进行远程调用,这样通过外观形式提供服务,那么不管是什么样
的客户端都访问一致的外观服务,那么以后就算是我们的应用服务发生变化,那么我们不需要修改没一个客户端应用的调用,只需要修改相应的外观应用即
可。
七、系列进度
创建型
1、系统架构技能之设计模式-单件模式
2、系统架构技能之设计模式-工厂模式
3、系统架构技能之设计模式-抽象工厂模式
4、系统架构技能之设计模式-创建者模式
5、系统架构技能之设计模式-原型模式
结构型
1、系统架构技能之设计模式-组合模式
2、系统架构技能之设计模式-外观模式
3、系统架构技能之设计模式-适配器模式
4、系统架构技能之设计模式-桥模式
5、系统架构技能之设计模式-装饰模式
6、系统架构技能之设计模式-享元模式
7、系统架构技能之设计模式-代理模式
行为型
1、系统架构技能之设计模式-命令模式
2、系统架构技能之设计模式-观察者模式
3、系统架构技能之设计模式-策略模式
4、系统架构技能之设计模式-职责模式
5、系统架构技能之设计模式-模板模式
6、系统架构技能之设计模式-中介者模式
7、系统架构技能之设计模式-解释器模式
八、下篇预告
下篇将会针对外观模式进行讲述,该模式也是结构型模式中很有特点设计模式之一,该 模式是将现有系统中的一些细粒度的东西通过外观对象包装起来,
在应用程序中访问这些方法的时候,通过外观类的形式,提供统一的访问入口,并且具体的细节,应用程序并不需要知道,这样就会降低程序调用的复杂
性,由于本人水平有限,不足或者有错误的地方,请大家批评指正,请大家继续支持我,谢谢。
九、Demo下载
本文Demo
相关文章:
设计模式系列-外观模式
一、上篇回顾 上篇我们主要讲述了创建型模式中的最后一个模式-原型模式,我们主要讲述了原型模式的几类实现方案,和原型模式的应用的场景和特点,原型模式 适合在哪些场景下使用呢?我们先来回顾一下我们上篇讲述的3个常用的场景。 1…...
DBeaver 下载、安装与数据库连接(MySQL)详细教程【超详细,保姆级教程!!!】
本文介绍DBeaver 下载、安装与数据库连接(MySQL)的详细教程 一、DBeaver 下载 官网下载地址:https://dbeaver.io/download/ 二、安装 1、双击下载的安装包,选择中文 2、点击下一步 3、点击我接受 4、如下勾选,…...
使用adjustText解决标签文字遮挡问题python
使用adjustText解决文字遮挡问题 1、一个例子2、adjust_text的用法使用pip install adjustText或conda install -c conda-forge adjusttext来安装adjustText。安装成功之后,首先生成随机示例数据以方便之后的演示: 1、一个例子 我们先不使用adjustText调整图像,直接绘制出原…...
[论文笔记]SiameseNet
引言 这是Learning Text Similarity with Siamese Recurrent Networks的论文笔记。 论文标题意思是利用孪生循环神经网络学习文本相似性。 什么是孪生神经网络呢?满足以下两个条件即可: 输入是成对的网络结构和参数共享(即同一个网络)如下图所示: 看到这种图要知道可能代…...
只有个体户执照,可以用来在抖音开店吗?抖店开通问题解答
我是王路飞。 在抖音开店的门槛,本身就是需要有营业执照的。 至于执照的类型,其实主要看商家自己。 如果你是新手商家,之前也没有怎么接触过电商行业,那么用个体执照在抖音开店足够用了,毕竟你要先入门,…...
微服务高可用容灾架构设计
导语 相对于过去单体或 SOA 架构,建设微服务架构所依赖的组件发生了改变,因此分析与设计高可用容灾架构方案的思路也随之改变,本文对微服务架构落地过程中的几种常见容灾高可用方案展开分析。 作者介绍 刘冠军 腾讯云中间件中心架构组负责…...
记录docker 部署nessus
1、开启容器 docker run -itd --nameramisec_nessus -p 8834:8834 ramisec/nessus 2、登录 :注意是https https://ip8843 3、修改admin密码 #进入容器 docker exec -it ramisec_nessus /bin/bash#列出用户名 /opt/nessus/sbin/nessuscli lsuser#修改密码&a…...
qt 正则表达式
以上是正则表达式的格式说明 以下是自己写的正则表达式 22-25行 是一种设置正则表达式的方式, 29-34行 : 29行 new一个正则表达式的过滤器对象 30行 正则表达式 的过滤格式 这个格式是0-321的任意数字都可以输入 31行 将过滤格式保存到过滤器对象里面 32行 将验…...
l8-d13 UNIX域套接字
一、UNIX 域流式套接字 本地地址 struct sockaddr_un { unsigned short sun_family; /* 协议类型 */ char sun_path[108]; /* 套接字文件路径 */ }; UNIX 域流式套接字的用法和 TCP 套接字基本一致,区别在于使用的协议和地址不同 UNIX 域流式套接字服务器…...
@RequiredArgsConstructor(onConstructor=@_(@Autowired))是什么语法?
这是 Lombok 语法糖写法。 在我们写controller或者Service层的时候,需要注入很多的mapper接口或者另外的service接口,这时候就会写很多的AutoWired注解 lombok提供注解: RequiredArgsConstructor(onConstructor __(Autowired))写在类上可以…...
FL Studio Producer Edition 21.0.3.3713中文完整破解版功能特点及安装激活教程
FL Studio Producer Edition 21.0.3.3713中文完整破解版是一款由Image Line公司研发几近完美的虚拟音乐工作站,同时也是知名的音乐制作软件。它让你的计算机就像是全功能的录音室,漂亮的大混音盘,先进的创作工具,让你的音乐突破想象力的限制。…...
Mybatis 动态语言 - mybatis-velocity
前面我们介绍了Mybatis动态SQL的使用;本篇我们介绍使用mybatis-velocity动态语言生成动态SQL。 如果您对Mybatis动态SQL不太了解,建议您先进行了解后再阅读本篇,可以参考: Mybatis 动态SQL – 使用if,where标签动态生成条件语句…...
Fourier傅里叶变换的线性性质和位移性质
Fourier傅里叶变换的线性性质和位移性质 为了阐述方便, 假定在这些性质中, 凡是需要求Fourier变换的函数都满足Fourier积分定理中的条件。在证明这些性质时, 不再重述这些条件。 一、线性性质 设 F 1 ( ω ) F [ f 1 ( t ) ] {F_1}(\omega ) {\mathscr F}[{f_1}(t)] F1(…...
# 磁盘引导方式相关知识之BIOS、msdos、MBR、UEFI、gpt、esp、csm
磁盘引导方式相关知识之BIOS、msdos、MBR、UEFI、gpt、esp、csm 磁盘、分区、引导等知识经常似懂非懂,不能完全说清楚,梳理下: 序号主板芯片引导方式支持的磁盘分区表类型支持的磁盘分区表格式对应引导位置备注1BIOS传统方式(俗…...
Java中同时POST文件和提交JSON数据的方法
一、引言 在Java中,可以使用java.net.URLConnection类来进行HTTP请求,并实现同时POST文件和提交JSON数据的功能。下面将通过一篇文章的形式为您详细讲解这个过程。 二、实现步骤 步骤一:导入所需的类库 首先,你需要导入以下类…...
【React】React获取URL参数,根据URL参数隐藏页面元素
React获取URL参数,根据URL参数隐藏页面元素 AI推荐方法 如果您想使用React获取URL参数并相应地隐藏页面元素,可以按照以下步骤进行操作: 导入React和React DOM: import React from react; import ReactDOM from react-dom;创建…...
第68步 时间序列建模实战:ARIMA建模(Matlab)
基于WIN10的64位系统演示 一、写在前面 这一期,我们使用Matlab进行SARIMA模型的构建。 不同样,这里使用另一个数据: 采用《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic …...
Gin学习记录3——模版与渲染
模版与渲染 一. 返回二. 模版2.1 基础模版2.2 同名模版2.3 模版继承2.4 模版语法 一. 返回 如果只是想返回数据,可以使用以下函数: func (c *Context) JSON(code int, obj any) func (c *Context) JSONP(code int, obj any) func (c *Context) String(…...
Python算法练习 9.11
leetcode 392 判断子序列 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcd…...
2023年中秋节和国庆节放假几天?用待办软件记录放假安排并提醒
进入公历9月,我们都期待着下个长假的到来。那么2023年中秋节和国庆节放假几天呢?因为今年的中秋节是公历的9月29日,所以今年的中秋节和国庆节是连在一起放假的。放假时间安排是9月29日至10月6日,一共放假8天。而10月7日和8日则是调…...
使用Python实现一个完整的声音采样和模拟,使用采样声音播放输入的文字,实现代码进行详细注释,并进行测试
目录 1.功能概述 2.原理介绍 2.1.声音采样原理 2.2.PCM系统原理 2.3.声音学习与训练...
测试----计算机网络
文章目录 计算机网络的历史OSI/RM 协议TCP/IP协议IP地址 计算机网络的历史 50-60年代 内部通讯功能(连接的是同一台主机,只能主机和终端之间通信,终端和终端之间的通讯只能依靠主机来传输)60-70年代 主机和主机之间能通讯70年代-…...
SVN 索引版本与打包版本号不匹配
今天突然遇到了一个问题,SVN上传不了,错误提示如下: 解决方法: 1.其实,这是SVN库不小心搞坏了,只能重新再创建一个SVN仓库了。...
HummerRisk V1.4.1 发布
HummerRisk V1.4.1发布: 大家好,增加检测整合报告下载,定制多云整合报告并下载PDF,增加K8s 检测规则组,Kubernetes、Rancher、KubeSphere 检测规则组以及规则。新增云账号管理页面关联菜单,新增资源同步日…...
php的html实体和字符之间的转换
html_entity_decode() 函数是 htmlentities() 函数的反函数。用于把HTML实体转换为字符。 html_entity_decode() 函数把 HTML 实体转换为字符。 $str "<© W3CSçh°°¦§>"; echo html_entity_decode($str…...
docker-compose deploy 高可用 elasticsearch TLS
文章目录 1.sysctl2. swap3. hosts4. 配置 instances.yaml5. 创建证书6. 部署7. 修改 kibanna 密码8. 清理 1.sysctl [rootgithub es_tls]# cat /etc/sysctl.conf # sysctl settings are defined through files in # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/…...
让GPT成为您的科研加速器丨GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图
GPT对于每个科研人员已经成为不可或缺的辅助工具,不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域:1、编程建议和示例代码:无论你使用的编程语言是Python、R、MATLAB还是其他语言,都可以为你提供相关的代码示例。2、数据可视化…...
工业互联网的破局密钥——低代码开发
纵观历史上三次工业革命的演进过程,以蒸汽机、电力、计算机为相应时代的“新型”基础设施建设,依托“通用技术”的广泛应用,带动了整个行业与市场的发展。 在发展数字经济成为必选题的今天,同样需要一个新型的、基础性的、通用型…...
JavaScript知识系列(2)每天10个小知识点
目录 系列文章目录JavaScript知识系列(1)每天10个小知识点 知识点**11. 如果 new 一个箭头函数的会怎么样****12. 箭头函数的 this 指向哪⾥?****13. 扩展运算符**的概念、作用、原理、特性、优点、缺点、区别、使用场景**14. Proxy**的概念、…...
Kotlin面向对象基础使用方法(继承、接口、Lambda、空指针检查机制等)
三、面向对象 1、继承 1.1 open改变类的继承属性 在kotlin设计时默认所有的非抽象类是无法被继承的,如果想要使得一个非抽象类可以被继承,我们需要使用open关键字。 open class Person {var name "";var age 0;fun eat() {println(name …...
精品建设课程网站/短网址链接生成
Win8 Metro(C#)数字图像处理--2.59 P分位法图像二值化 原文:Win8 Metro(C#)数字图像处理--2.59 P分位法图像二值化[函数名称] P分位法图像二值化 [算法说明] 所谓P分位法图像分割,就是在知道图像中目标所占的比率Ratio时,循环不…...
北京网站制作公司都在哪里/商业推广软文范例
一.应用知识点1.2实验知识点div布局CSS相对定位CSS各种属性的应用1.3实验环境本实验环境采用带桌面的Ubuntu Linux环境,实验中可能会用到桌面上的程序:Firefox:浏览器,可以用在需要前端界面的课程里,只需要打开环境里写…...
义乌网站建设优化案例/网站测试报告
1、安装vue-router插件npm install vue-router --save其中--save是为了保存在package.json配置中,写在配置文件中下次install的时候,依赖包就会按照json文件中的配置项进行安装2、在src中新建一个配置动态路由的js文件,js文件主要配置对应的路…...
怎么做娱乐电玩网站/济南专业seo推广公司
2019独角兽企业重金招聘Python工程师标准>>> 1、 Tomcat介绍 • Tomcat服务器是一个免费的开放源代码的Web应用服务器。是一个免费的开源的Servlet容器,Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一…...
清河做网站哪里好/淘宝流量助手平台
文章目录MSE与PSNR的计算方法MSE与PSNR的问题SSIM的理念与计算方法理念概念准备公式理解基本元素三原则亮度、对比度、结构的相似度指标设计最终公式程序计算方法计算公式推导程序MSE与PSNR的计算方法 MSE: Mean Square Error,均方误差 PSNR: Peak Signal to Nois…...
免费手机网站源码下载/西安百度推广客服电话多少
1、maven群组[url]http://www.iteye.com/groups/search?querymaven[/url]2、搜索maven集合 [url]http://www.iteye.com/search?typeall&querymaven&sort[/url]...