学习设计模式 (三)(总结)

本文详细介绍了三种设计模式:责任链模式、蝇量模式(享元模式)与解释器模式。责任链模式通过解耦请求的发送者与接收者,使得请求沿着链传递直至被处理。蝇量模式强调共享机制以高效管理大量细粒度对象。解释器模式允许客户端解释并执行简单的语言规则。文章深入剖析了每种模式的优点、用途和局限性。

17.责任链模式

责任链模式:如果有多个对象都有机会处理请求,责任链可使请求的发送者和接收者解耦,请求沿着责任链传递,直到有一个对象处理了它为止。

类图:



优点:

1.将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求

2.可以简化对象,因为它无须知道链的结构

3.可以动态地增加或删除处理请求的链结构

缺点:

1.请求从链的开头进行遍历,对性能有一定的损耗

2.并不保证请求一定被处理

责任链模式和状态模式的区别:

责任链模式注重请求的传递,而状态模式注重对象状态的转换


18.蝇量模式(享元模式)


定义:通过共享的方式高效地支持大量细颗粒度的对象




 类图:


 

优点:

  减少运行时对象实例的个数,节省内存。

  将许多“虚拟”对象的状态集中管理。

用途:

  当一个类有许多的实例,而这些实例能被同一方法控制的时候,我们就可以使用蝇量模式。

缺点:

  蝇量模式的缺点在于,一旦你实现了它,那么单个的逻辑实例将无法拥有独立的而不同的行为,使系统更复杂。


19.解释器模式

定义:给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。
类图:

 

(1)抽象解释器(AbstractExpression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称做解释操作。

(2)终结符解释器(Terminal Expression)角色:实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。

(3)非终结符解释器(Nonterminal Expression)角色:文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,“+"就是非终结符,解析“+”的解释器就是一个非终结符表达式。

(4)环境(Context)角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。

 

优点:

  将每一个语法规则表示成一个类,方便于实现语言。

  因为语法由许多类表示,所以你可以轻易地改变或扩展此语言。

  通过在类结构中加入新的方法,可以在解释的同时增加新的行为,例如打印格式的美化或者进行复杂的程序验证。

用途:

  当你需要实现一个简单的语言时,使用解释器。

  当你有一个简单的语法,而且简单比效率更重要时,使用解释器。

  可以处理脚本语言和编程语言。

缺点:

  当语法规则的数目太大时,这个模式可能会变得非常繁杂。在这种情况下,使用解释器/编译器的产生器可能更合适。

 

20.中介者模式

定义:用一个中介者对象来封装一系列的对象交互

例子场景:有一个自动屋,但是其中有着复杂的规则。想要持续地追踪每个对象的每个规则,以及众多对象之间彼此错综复杂的关系,实在不容易。

  在这个系统中加入一个中介者,一切都变得简单了:

  每个对象都会在自己的状态改变时,告诉中介者。

  每个对象都会对中介者所发出的请求作出回应。

 

 

  中介者内包含了整个系统的控制逻辑。当某装置需要一个新的规则时,或者是一个新的装置被加入系统内,其所有需要用到的逻辑也都被加进了中介者内。

类图:



优点:

  通过将对象彼此解耦,可以增加对象的复用性。

  通过将控制逻辑集中,可以简化系统维护。

  可以让对象之间所传递的消息变得简单而且大幅减少。

用途:

  中介者常常被用来协调相关的GUI组件。

缺点:

  中介者模式的缺点是,如果设计不当,中介者对象本身会变得过于复杂。

 

中介者模式、代理模式和外观模式三者的区别与联系


1,中介者模式:A,B之间的对话通过C来传达。A,B可以互相不认识(减少了A和B对象间的耦合)

2,代理模式:A要送B礼物,A,B互相不认识,那么A可以找C来帮它实现送礼物的愿望(封装了A对象)

3,外观模式:A和B都要实现送花,送巧克力的方法,那么我可以通过一个抽象类C实现送花送巧克力的方法(A和B都继承C)。(封装了A,B子类)

代理模式和外观者模式这两种模式主要不同就是代理模式针对的是单个对象,而外观模式针对的是所有子类。




21.备忘录模式

定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态

类型:行为类

类图:


        我们在编程的时候,经常需要保存对象的中间状态,当需要的时候,可以恢复到这个状态。比如,我们使用Eclipse进行编程时,假如编写失误(例如不小心误删除了几行代码),我们希望返回删除前的状态,便可以使用Ctrl+Z来进行返回。这时我们便可以使用备忘录模式来实现。

 

备忘录模式的结构

  • 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。
  • 备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
  • 管理角色:对备忘录进行管理,保存和提供备忘录。
优点:

1.状态存储在外面,不和关键对象混在一起,这可以帮助维护内聚

2.提供了容易实现的恢复能力

3.保持了关键对象的数据封装

缺点:

1.资源消耗上面备忘录对象会很昂贵

2.存储和恢复状态的过程比较耗时


22.原型模式


定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

类图:


原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:

1.实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。

2.重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。


        原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。


优点:
1.使用原型模式创建对象比直接new一个对象更有效
2.隐藏制造新实例的复杂性
3.重复地创建相似对象时可以考虑使用原型模式
缺点:
1.一个类必须配备一个克隆方法
2.深层复制比较复杂、
注意事项:
1.使用原型模式复制对象不会调用类的构造方法。所有,单例模式与原型模式是冲突的,在使用时要特别注意。
2.Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝

23.访问者模式

定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

类图:


优点:
1.符合单一责任原则
2.扩展性良好
3.有益于系统的管理和维护
缺点:
1.增加新的元素类变的很困难
2.破环封装性

欧姆龙FINS(工厂集成网络系统)协议是专为该公司自动化设备间数据交互而设计的网络通信标准。该协议构建于TCP/IP基础之上,允许用户借助常规网络接口执行远程监控、程序编写及信息传输任务。本文档所附的“欧ronFins.zip”压缩包提供了基于C与C++语言开发的FINS协议实现代码库,旨在协助开发人员便捷地建立与欧姆龙可编程逻辑控制器的通信连接。 FINS协议的消息框架由指令头部、地址字段、操作代码及数据区段构成。指令头部用于声明消息类别与长度信息;地址字段明确目标设备所处的网络位置与节点标识;操作代码定义了具体的通信行为,例如数据读取、写入或控制器指令执行;数据区段则承载实际交互的信息内容。 在采用C或C++语言实施FINS协议时,需重点关注以下技术环节: 1. **网络参数设置**:建立与欧姆龙可编程逻辑控制器的通信前,必须获取控制器的网络地址、子网划分参数及路由网关地址,这些配置信息通常记载于设备技术手册或系统设置界面。 2. **通信链路建立**:通过套接字编程技术创建TCP连接至控制器。该过程涉及初始化套接字实例、绑定本地通信端口,并向控制器网络地址发起连接请求。 3. **协议报文构建**:依据操作代码与目标功能构造符合规范的FINS协议数据单元。例如执行输入寄存器读取操作时,需准确配置对应的操作代码与存储器地址参数。 4. **数据格式转换**:协议通信过程中需进行二进制数据的编码与解码处理,包括将控制器的位状态信息或数值参数转换为字节序列进行传输,并在接收端执行逆向解析。 5. **异常状况处理**:完善应对通信过程中可能出现的各类异常情况,包括连接建立失败、响应超时及错误状态码返回等问题的处理机制。 6. **数据传输管理**:运用数据发送与接收函数完成信息交换。需注意FINS协议可能涉及数据包的分割传输与重组机制,因单个协议报文可能被拆分为多个TCP数据段进行传送。 7. **响应信息解析**:接收到控制器返回的数据后,需对FINS响应报文进行结构化解析,以确认操作执行状态并提取有效返回数据。 在代码资源包中,通常包含以下组成部分:展示连接建立与数据读写操作的示范程序;实现协议报文构建、传输接收及解析功能的源代码文件;说明库函数调用方式与接口规范的指导文档;用于验证功能完整性的测试案例。开发人员可通过研究这些材料掌握如何将FINS协议集成至实际项目中,从而实现与欧姆龙可编程逻辑控制器的高效可靠通信。在工程实践中,还需综合考虑网络环境稳定性、通信速率优化及故障恢复机制等要素,以确保整个控制系统的持续可靠运行。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值