【设计模式深度剖析】【9】【行为型】【访问者模式】| 以博物馆的导览员为例加深理解
👈️上一篇:备忘录模式 | 下一篇:状态模式👉️
设计模式-专栏👈️
文章目录
- 访问者模式
- 定义
- 英文原话
- 直译
- 如何理解呢?
- 访问者模式的角色
- 类图
- 代码示例
- 访问者模式的应用
- 优点
- 缺点
- 使用场景
- 示例解析:博物馆的导览员
- 代码示例
访问者模式
访问者模式(Visitor Pattern)就像一位多才多艺的导游,能够根据不同的景点(数据结构中的元素)提供个性化的解说服务(操作),而无需改变景点的本质。
定义
英文原话
The Visitor pattern is a behavioral design pattern that allows you to add new operations to objects without changing their classes. A visitor is a class with methods that correspond to the classes of an object structure it visits. A client uses the visitor to perform the operations on the elements of the object structure.
直译
访问者模式是一种行为设计模式,它允许我们在不改变对象类的情况下为对象添加新的操作。访问者是一个类,它包含的方法对应于它所访问的对象结构中的类。客户端使用访问者来对对象结构的元素执行操作。
如何理解呢?
想象一下我们有一个装满各种形状(圆形、矩形、三角形)的盒子。现在我们想对这些形状进行不同的操作,比如测量它们的面积或周长。使用访问者模式,我们可以创建一个“测量工具”(即访问者),它知道如何与每种形状交互并获取所需的信息,而不需要改变形状本身。
访问者模式的角色
访问者模式中的角色包括:
- Visitor(访问者):这是一个接口或抽象类,声明了访问特定元素类时需要执行的操作。
- ConcreteVisitor(具体访问者):实现了Visitor接口或继承了Visitor抽象类,实现了对元素类中每个元素的访问操作。
- Element(元素):这是一个接口或抽象类,声明了一个接受访问者对象的方法(通常是
accept
)。 - ConcreteElement(具体元素):实现了Element接口或继承了Element抽象类,并实现
accept
方法以接受访问者的访问。 - ObjectStructure(对象结构):能够枚举它的元素,并可以提供一个高层接口以允许访问者访问它的元素。这通常是一个集合类,如列表或树。
类图
代码示例
package com.polaris.designpattern.list3.behavioral.pattern09.visitor.classicdemo;import java.util.ArrayList;
import java.util.List;// Visitor 接口
interface Visitor {void visit(ConcreteElementA element);void visit(ConcreteElementB element);
}// ConcreteVisitor 类
class ConcreteVisitor implements Visitor {@Overridepublic void visit(ConcreteElementA element) {System.out.println("Visiting ConcreteElementA: " + element.operationA());}@Overridepublic void visit(ConcreteElementB element) {System.out.println("Visiting ConcreteElementB: " + element.operationB());}
}// Element 接口
interface Element {void accept(Visitor visitor);
}// ConcreteElementA 类
class ConcreteElementA implements Element {@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public String operationA() {return "elementA info...";}
}// ConcreteElementB 类
class ConcreteElementB implements Element {@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public String operationB() {return "elementB info...";}
}// ObjectStructure 类(这里简单用ArrayList作为示例)class ObjectStructure {private List<Element> elements = new ArrayList<>();public void add(Element element) {elements.add(element);}public void accept(Visitor visitor) {for (Element element : elements) {element.accept(visitor);}}
}// 客户端代码
public class VisitorPatternDemo {public static void main(String[] args) {ObjectStructure objectStructure = new ObjectStructure();objectStructure.add(new ConcreteElementA());objectStructure.add(new ConcreteElementB());Visitor visitor = new ConcreteVisitor();objectStructure.accept(visitor);}
}
/* Output:
Visiting ConcreteElementA: elementA info...
Visiting ConcreteElementB: elementB info...
*///~
在这个示例中,我们有一个Visitor
接口和两个具体的访问者方法(对应于两种不同类型的元素)。我们还有两个实现了Element
接口的ConcreteElement
类,它们各自有自己的操作。ObjectStructure
类管理了一个Element
对象的集合,并提供了一个accept
方法来遍历这些对象并接受访问者的访问。在客户端代码中,我们创建了一个ObjectStructure
对象,并向其中添加了两个不同类型的元素。然后,我们创建了一个ConcreteVisitor
对象,并使用它来访问ObjectStructure
中的所有元素。
访问者模式的应用
访问者模式是一种设计模式,它允许在不改变数据结构的前提下,为数据结构中的每个元素定义新的操作。这种模式在需要为数据结构中的元素添加新行为,但又不想修改这些元素所在类的情况下特别有用。
优点
- 扩展性好:当需要为数据结构中的元素添加新操作时,只需定义一个新的访问者类即可,无需修改原有类。
- 复用性好:访问者模式可以通过为不同的数据结构定义相同的访问者接口,实现操作的复用。
- 灵活性好:访问者模式将数据结构与作用于结构上的操作解耦,使得操作集合可以相对自由地演化而不影响系统的数据结构。
- 符合单一职责原则:每个访问者只负责一种操作,使代码更加清晰和易于维护。
缺点
- 破坏封装:在访问者模式中,具体元素需要向访问者公开其内部状态和方法,这可能会破坏对象的封装性。
增加新数据结构困难
:当需要为新的数据结构添加访问者时,需要在访问者接口中添加新的方法,这可能会增加代码的复杂性。- 具体元素变更困难:如果具体元素的内部结构发生变化,可能需要修改所有相关的访问者类,这可能会增加维护成本。
使用场景
- 电商网站商品分类与操作:电商网站通常有大量的商品,这些商品可以按照不同的属性进行分类。使用访问者模式,可以定义一个访问者对象,它能够访问不同类型的商品对象,并根据需要执行不同的操作,如按照价格排序、根据品牌筛选等。
- 图形编辑器的操作处理:在图形编辑器中,有多种图形元素,如线条、圆形、矩形等。访问者模式允许定义一个访问者对象,它能够访问这些图形元素并执行不同的操作,如移动、缩放、旋转或改变颜色等。
- 编译器和解释器设计:在编译器或解释器的设计中,抽象语法树(
AST
)是一个常见的数据结构。使用访问者模式,可以为AST中的不同节点类型定义不同的访问者,以执行如类型检查、代码优化、代码生成等操作。
将源程序表示为一个抽象语法树,编译器需要在抽象语法树上实施某些操作以进行“静态语义分析”,例如检查是否所有的变量都已经被定义了。他也需要生成代码。因此他可能要定义许多操作以进行类型检查、代码优化、流程分析,检查变量是否在使用前被赋初值,等等。此外,还可以使用抽象语法树进行优美格式打印、程序重构、code instrumentation(代码插装,见下面note注释内容)以及对程序进行多种度量。
这些操作大多要求对不同的节点进行不同的处理。例如对代表赋值语句的结点的处理就不同于对代表变量或算术表达式的结点的处理。
因此,有用于赋值语句的类,有用于变量访问的类,还有用于算术表达式的类等等。结点类的集合当然依赖于被编译的语言,但对于一个给定的语言其变化不大(即已有的数据结构变化不大或不变)。
note: Code instrumentation(代码仪器化)是一种软件开发领域的技术。详细解释如下:
- 定义
- Code instrumentation涉及向代码中插入特定的指令或代码片段,以便在程序执行过程中收集各种信息或执行特定的任务。
- 用途
- 调试:通过插入额外的代码,可以更容易地跟踪和调试程序的行为。
- 性能分析:插入的代码可以收集程序的性能数据,如执行时间、内存使用等。
- >代码覆盖率分析>:用于确定哪些代码在测试过程中被实际执行过。
- 安全检查:可以插入用于检测潜在安全问题的代码。
- 实现
- 通过在代码中嵌入仪器化代码,开发人员可以更深入地了解程序的执行过程,并获取关键的运行时信息。
- 其他表述
- Code instrumentation有时也被称为**“代码插装”或“代码插桩”**。
- 应用实例
- 在自动化测试和内部质量保证(QA)工具中,code instrumentation被用于基础设施、实施和维护,以及支持代码覆盖率的分析。
总结来说,code instrumentation是一种通过向代码中插入特定指令或代码片段来收集信息或执行任务的软件开发技术,它在调试、性能分析、代码覆盖率分析和安全检查等方面发挥着重要作用。
示例解析:博物馆的导览员
假设你是一家博物馆的导览员,博物馆里有很多不同类型的展品,如绘画、雕塑和古代文物。作为导览员,你需要为不同类型的展品提供不同的解说词。但是,展品的种类可能会随着时间增加或减少,而你不希望每次有新的展品加入时都要重新学习所有的解说词。
在这里,展品可以看作是数据结构中的元素,而导览员就是访问者。导览员(访问者)需要访问不同的展品(元素),并为它们提供解说词(操作)。
代码示例
下面是一个简单的Java代码示例,用于模拟这个场景:
package com.polaris.designpattern.list3.behavioral.pattern09.visitor.demo1;// 展品接口
interface Artifact {void accept(TourGuide tourGuide);
}// 绘画展品
class Painting implements Artifact {private String name;public Painting(String name) {this.name = name;}@Overridepublic void accept(TourGuide tourGuide) {tourGuide.visit(this);}public String getName() {return name;}
}// 雕塑展品
class Sculpture implements Artifact {private String name;public Sculpture(String name) {this.name = name;}@Overridepublic void accept(TourGuide tourGuide) {tourGuide.visit(this);}public String getName() {return name;}
}// 导览员(访问者)接口
interface TourGuide {void visit(Painting painting);void visit(Sculpture sculpture);// 如果以后有更多类型的展品,可以在这里添加方法
}// 具体导览员类
class EnglishTourGuide implements TourGuide {@Overridepublic void visit(Painting painting) {System.out.println("This is a painting called " + painting.getName() + ". It is beautiful!");}@Overridepublic void visit(Sculpture sculpture) {System.out.println("This is a sculpture called " + sculpture.getName() + ". It is impressive!");}
}// 客户端代码
public class MuseumDemo {public static void main(String[] args) {// 创建展品 Artifact painting = new Painting("Mona Lisa");Artifact sculpture = new Sculpture("Thinker");// 创建导览员 TourGuide tourGuide = new EnglishTourGuide();// 导览员访问展品 painting.accept(tourGuide);sculpture.accept(tourGuide);}
}/* Output:
This is a painting called Mona Lisa. It is beautiful!
This is a sculpture called Thinker. It is impressive!
*///~
在这个示例中,
Artifact
是展品接口,Painting
和Sculpture
是具体的展品类。TourGuide
是导览员接口,EnglishTourGuide
是具体的导览员类。
当新的展品类型出现时,只需要实现Artifact
接口并添加相应的accept
方法,然后在TourGuide
接口中添加对应的visit
方法即可,而不需要修改已经存在的展品类和导览员类(除了添加新的方法外)。这样,就实现了在不改变数据结构的前提下,为数据结构中的每个元素定义新的操作。
note1: 当系统需要添加新的操作到已有的数据结构(如不同的展品类型)时,我们可以通过增加一个新的访问者类来实现,而无需修改原有的数据结构。
note2:当新的展品类型出现时,需要:
- 实现
Artifact
接口来定义新的展品类(比如Ceramic
代表陶瓷展品
)。- 在
Artifact
接口的实现类(如Ceramic
)中,实现accept
方法以允许导览员(TourGuide
)访问。- 修改
TourGuide
接口,添加一个新的visit
方法来处理新的展品类型(比如void visit(Ceramic ceramic);
)。- 在
TourGuide
的实现类(如EnglishTourGuide
)中,实现新添加的visit
方法以提供针对新展品类型的解说词。这样,当新的展品类型被添加到博物馆时,导览员(
TourGuide
)就能够处理它,而不需要修改已经存在的展品类和导览员类(除了添加新的方法外)。这种设计使得系统的扩展性很好,能够轻松应对新的展品类型的添加。
👈️上一篇:备忘录模式 | 下一篇:状态模式👉️
设计模式-专栏👈️
相关文章:
![](https://img-blog.csdnimg.cn/direct/03ddffa0ff4a481ebe02b565cf52f5c1.png)
【设计模式深度剖析】【9】【行为型】【访问者模式】| 以博物馆的导览员为例加深理解
👈️上一篇:备忘录模式 | 下一篇:状态模式👉️ 设计模式-专栏👈️ 文章目录 访问者模式定义英文原话直译如何理解呢? 访问者模式的角色类图代码示例 访问者模式的应用优点缺点使用场景 示例解析:博物馆的导览员代码示例 访问…...
Salesforce‘s 爱因斯坦机器人助手引领工业聊天机器人时代
CRM的对话式人工智能助手,根据公司数据提供可靠的人工智能响应及日本工业聊天机器人现状 【前言】 爱因斯坦助手(Einstein Copilot)提供可靠的响应,因为它基于公司独特的数据和元数据,使其能够深入了解公司的业务和客…...
![](https://img-blog.csdnimg.cn/direct/a00d7d3c496a4814bc40c15d4bc87003.png)
Day7—zookeeper基本操作
ZooKeeper介绍 ZooKeeper(动物园管理员)是一个分布式的、开源的分布式应用程序的协调服务框架,简称zk。ZooKeeper是Apache Hadoop 项目下的一个子项目,是一个树形目录服务。 ZooKeeper的主要功能 配置管理 分布式锁 集群管理…...
![](https://img-blog.csdnimg.cn/direct/b73584e7b91d42f9a36f7cff587d1c72.png)
计算机组成原理---Cache的基本工作原理习题
对应知识点: Cache的基本原理 1.某存储系统中,主存容量是Cache容量的4096倍,Cache 被分为 64 个块,当主存地址和Cache地址采用直接映射方式时,地址映射表的大小应为()(假设不考虑一致维护和替…...
![](https://www.ngui.cc/images/no-images.jpg)
springboot项目中切数据库(mysql-> pg)带来的适配问题:typeHandler
一、数据表中有一张表,名为role_permission,DDL如下: CREATE TABLE "public"."role_permission" ( "role_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, "permiss…...
![](https://img-blog.csdnimg.cn/direct/3f0d5ea0e1224227a3c4c699fa7eb412.png)
从零开始的<vue2项目脚手架>搭建:vite+vue2+eslint
前言 为了写 demo 或者研究某些问题,我经常需要新建空项目。每次搭建项目都要从头配置,很麻烦。所以我决定自己搭建一个项目初始化的脚手架(取名为 lily-cli)。 脚手架(scaffolding):创建项目时…...
![](https://img-blog.csdnimg.cn/direct/faeebf13c425431a8554088114a97d9d.png)
Hadoop升级失败,File system image contains an old layout version -64
原始版本 Hadoop 3.1.3 升级版本 Hadoop 3.3.3 报错内容如下 datasophon 部署Hadoop版本 查看Hadoop格式化版本 which hadoop-daemon.sh/bigdata/app/hadoop-3.1.3/sbin/hadoop-daemon.sh删除原来的旧版本 rm -rf /bigdata/app/hadoop-3.1.3查看环境变量 env|grep HADOOPHAD…...
![](https://img-blog.csdnimg.cn/direct/a532fe7466664f8ab129d0b58734aab2.png)
[机器学习算法]决策树
1. 理解决策树的基本概念 决策树是一种监督学习算法,可以用于分类和回归任务。决策树通过一系列规则将数据划分为不同的类别或值。树的每个节点表示一个特征,节点之间的分支表示特征的可能取值,叶节点表示分类或回归结果。 2. 决策树的构建…...
![](https://img-blog.csdnimg.cn/direct/f0fec57891a84120960b1b7baeee1320.png)
springboot应用cpu飙升的原因排除
1、通过top或者jps命令查到是那个java进程, top可以看全局那个进程耗cpu,而jps则默认是java最耗cpu的,比如找到进程是196 1.1 top (推荐)或者jps命令均可 2、根据第一步获取的进程号,查询进程里那个线程最占用cpu,发…...
![](https://img-blog.csdnimg.cn/direct/1fcac917900a43d28c67e67571dfee81.png)
反激开关电源EMI电路选型及计算
EMI :开关电源对电网或者其他电子产品的干扰 EMI :传导与辐射 共模电感的滤波电路,La和Lb就是共模电感线圈。这两个线圈绕在同一铁芯上,匝数和相位都相 同(绕制反向)。 这样,当电路中的正常电流(差模&…...
![](https://img-blog.csdnimg.cn/img_convert/955f69abc133f70439df17b54fcfb577.png)
vue3前端对接后端的图片验证码
vue3前端对接后端的图片验证码 <template> <image :src"captchaUrl" alt"图片验证码" click"refreshCaptcha"></image> </template><script setup>import {ref} from "vue";import {useCounterStore} …...
![](https://img-blog.csdnimg.cn/direct/f47666aec6714778bc8be89a10a024b9.png)
【Unity】RPG2D龙城纷争(四)要诀、要诀数据集
更新日期:2024年6月20日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介要诀数据集(AbilityDataSet)一、定义要诀数据集类二、要诀属性1.要诀类型2.攻击距离3.基础命中、暴击率4.基础属性加成5.…...
![](https://img-blog.csdnimg.cn/img_convert/e174349dee63a18f82b8f4790a1882e8.png)
一种基于非线性滤波过程的旋转机械故障诊断方法(MATLAB)
在众多的旋转机械故障诊断方法中,包络分析,又称为共振解调技术,是目前应用最为成功的方法之一。首先,对激励引起的共振频带进行带通滤波,然后对滤波信号进行包络谱分析,通过识别包络谱中的故障相关的特征频…...
![](https://img-blog.csdnimg.cn/direct/9b40e4acdec94393b6929dbbb8128978.png)
HarmonyOS Next 系列之从手机选择图片或拍照上传功能实现(五)
系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现(一) HarmonyOS Next 系列之验证码输入组件实现(二) HarmonyOS Next 系列之底部标签栏TabBar实现(三) HarmonyOS Next 系列之HTTP请求封装和Token…...
![](https://www.ngui.cc/images/no-images.jpg)
如果xml在mapper目录下,如何扫描到xml
如果xml在mapper目录下,如何扫描到xml 项目结构 src├── main│ ├── java│ │ └── com│ │ └── bg│ │ ├── Application.java│ │ ├── domain│ │ │ └── User.java│ │ …...
![](https://img-blog.csdnimg.cn/img_convert/ed5b74d8f8b174ed51e8407a00ccc844.jpeg)
什么是无限铸币攻击?它是如何运作的?
一、无限铸币攻击解释 无限铸币攻击是指攻击者操纵合约代码不断铸造超出授权供应限制的新代币。 这种黑客行为在去中心化金融 (DeFi) 协议中最为常见。这种攻击通过创建无限数量的代币来损害加密货币或代币的完整性和价值。 例如,一名黑客利用了 Paid 网络的智能…...
![](https://www.ngui.cc/images/no-images.jpg)
【Android】怎么使APP进行开机启动
项目需求 在Android系统开启之后,目标app可以在系统开机之后启动。 项目实现 使用广播的方式 首先我们要创建一个广播(这里是启动了一个Service服务) public class BootReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, I…...
![](https://img-blog.csdnimg.cn/direct/6917beb6071d40cf9f3cee4af1a62e2b.png)
详细分析Element Plus的el-pagination基本知识(附Demo)
目录 前言1. 基本知识2. Demo3. 实战 前言 需求:从无到有做一个分页并且附带分页的导入导出增删改查等功能 前提一定是要先有分页,作为全栈玩家,先在前端部署一个分页的列表 相关后续的功能,是Java,推荐阅读&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
ubuntu换镜像源方法
查看ubuntu的版本,不同的版本对应的不同的镜像源 cat /etc/issue Ubuntu 18.04.6 LTS \n \l 先备份一个,防止更改错误 cobol cp /etc/apt/sources.list /etc/apt/sources.list.backup 先进入清华源,搜索ubuntu,点击问号 点进来可以看到可以…...
![](https://img-blog.csdnimg.cn/direct/1cec9cb8438a4d5496f3fd21f2cb659a.jpeg)
python flask配置邮箱发送功能,使用flask_mail模块
🌈所属专栏:【Flask】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的点…...
![](https://img-blog.csdnimg.cn/img_convert/119b7a1296c2715ae20c3f2492ac2fe9.png)
Flask快速入门(路由、CBV、请求和响应、session)
Flask快速入门(路由、CBV、请求和响应、session) 目录 Flask快速入门(路由、CBV、请求和响应、session)安装创建页面Debug模式快速使用Werkzeug介绍watchdog介绍快速体验 路由系统源码分析手动配置路由动态路由-转换器 Flask的CBV…...
![](https://img-blog.csdnimg.cn/direct/f145001014864c6ea5915d6224a43194.png)
人工智能指数报告
2024人工智能指数报告(一):研发 前言 全面分析人工智能的发展现状。 从2017年开始,斯坦福大学人工智能研究所(HAI)每年都会发布一份人工智能的研究报告,人工智能指数报告(AII&…...
![](https://img-blog.csdnimg.cn/img_convert/248e4474d5527f5e31e83d4bcd4b966e.jpeg)
聊聊 Mybatis 动态 SQL
这篇文章,我们聊聊 Mybatis 动态 SQL ,以及我对于编程技巧的几点思考 ,希望对大家有所启发。 1 什么是 Mybatis 动态SQL 如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼…...
![](https://img-blog.csdnimg.cn/direct/fb597a3fea6346bebec989a512e0b0fe.gif)
【windows|004】BIOS 介绍及不同品牌电脑和服务器进入BIOS设置的方法
🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专家博主 💊交流社…...
![](https://img-blog.csdnimg.cn/direct/0262b6d404584db4846ea83c57b9ea52.png)
lvgl的应用:移植MusicPlayer(基于STM32F407)
目录 概述 1 软硬件环境 1.1 UI开发版本 1.2 MCU开发环境 1.3 注意点 2 GUI Guider开发UI 2.1 使用GUI Guider创建UI 2.2 GUI Guider编译项目和测试 2.2.1 GUI Guider编译项目 2.2.2 编译 2.3 了解GUI Guider生成代码 3 移植项目 3.1 Keil中加载代码 3.2 调用G…...
![](https://img-blog.csdnimg.cn/direct/1c52da33d1464ed0b149f03baee289c9.jpeg)
Hadoop3:MapReduce中的Shuffle机制
一、流程图 Shuffle是Map方法之后,Reduce方法之前的数据处理过程称。 二、图解说明 1、数据流向 map方法中context.write(outK, outV);开始,写入环形缓冲区,再进行分区排序,写到磁盘 reduce方法拉取磁盘上的数据,…...
![](https://img-blog.csdnimg.cn/direct/8fc86d5e56cb4c33a4a7ba96cb9abed4.png)
从设计到实践:高速公路监控技术架构全剖析
随着高速公路网络的迅速扩展和交通流量的日益增加,高效的监控系统成为保障交通安全、提升管理效率的重要手段。本文将深入探讨高速公路监控技术架构,从设计理念到实际应用,全面解析这一关键技术的各个环节。 ### 一、系统设计理念 #### 1. 高…...
![](https://www.ngui.cc/images/no-images.jpg)
Go Context
Context 介绍 Context 代表了协程的上下文,用以在父子协程之间传递控制信号,共享变量等操作// context.Context 接口 type Context interface {// 当Context自动取消或者到了取消时间被取消后返回Deadline() (deadline time.Time, ok bool)// 当Contex…...
![](https://img-blog.csdnimg.cn/direct/ac8062a8fc3b415b88880a1a8c72b4d0.png)
centOS Stream9配置NAT8网络
首先将VMware关机,添加网络适配器 启动虚拟机,查看ens192是否打开连接 安装的图形化需要查看右上角电源处网卡是否连接 最小化安装一般不会出现未连接的状态 使用ip a 查看 配置网卡文件 cd /etc/NetworkManager/system-connections/cd到当前目录下…...
![](https://img-blog.csdnimg.cn/direct/cde8f0a0a6b645f8b78d3afd168ad20a.png)
Linux - 进程
一、什么是进程 首先,Linux是一个多用户多进程的操作系统,系统上可以同时运行多个进程。 进程的产生:①是在执行程序或者命令时产生的;②定时任务进程 进程的类型:前台进程/后台进程 前台进程:一个终端…...
![](/images/no-images.jpg)
网站建设行业现状/莆田seo推广公司
有的时候我们可能不得不使用 js 来处理 html entities,例如把 > 这样的内容转化成 > 符号,或者是相反的操作。如果你不幸遇到了这样的需求,下面的内容也许会有所帮助。unescapeHtmlEntities 的实现非常简单,创建一个节点元素…...
![](http://images.cnitblog.com/blog/360778/201402/271056422044524.jpg)
吉林电商网站建设/百度推广费
按照http://blog.csdn.net/azkabannull/article/details/7872958中的方法,在cygwin中运行runbundler.sh; 按照http://oliver.zheng.blog.163.com/blog/static/1424115952011915113138431/中的方法,使用Bundle2PMVS.exe和prep_pmvs.sh&#x…...
![](https://images0.cnblogs.com/blog/54346/201307/12083411-dccb87efe0e5435e9b8cd97391321ecb.png)
廊坊做网站哪家好/必应搜索引擎地址
一 背景 最近在园子了浏览了几篇有关Socket文章,得到了一些启发萌生了想要重构公司在2000年用.NET Framework 2.0 与 Visual Studio 2005开发的AsySocket项目为了希望能够尽快的了解公司这个项目,Google了很多国内外的网站让我对Socket有了更深层次的了解…...
![](https://images2015.cnblogs.com/blog/961371/201612/961371-20161204133740115-2762390.png)
有没有专门做帽子的网站/精准引流推广团队
1. 学生模块list页面 不能正常跳转 说是找不到stuid属性,但是我在entity里面和数据库建表的属性就是stuid;Grade模块代码一样,却可以正常运行 这是什么问题? <c:forEach items"slist" var"student"> &l…...
![](http://o7ubfyghw.bkt.clouddn.com/set%20shutter%20shortcut%2002.jpg)
有域名和虚拟服务器后怎么做网站/seo课程多少钱
在linux mint上使用shutter,可以通过快捷键提高使用舒适度 1.找到“键盘”,设置应用程序和快捷键 2.设置应用程序快捷键为ctrlalta 在需要截图的时候,调用快捷键即可 在shutter的“编辑–> 首选项” 中可以设置保存路径、行为等...
![](/images/no-images.jpg)
怎样做淘宝联盟网站/google首页
在后面标注字段类型就可以了 #{id,jdbcTypeVARCHAR}...