(1)设计模式初窥

大部分出自:Objective-C编程之道 ios设计模式解析

1 前言
有些人可能会问,我也能实现某某功能,为什么要花时间来学习设计模式。今天我们就来了解一下设计模式的优势:

程序(包括对象和类),如果在设计中使用了设计模式,将来将更易于复用与扩展,更易于变更。而且基于设计模式的程序会更加简洁而高效,因为达到同样目的的所需代码行数会更少。

接下来就让我们一起走入神奇的设计模式的世界来体会其给我们带来便利。

2 详述
记得之前文章我们介绍了Cocoa Touch的MVC模式,而他并非最基本的设计模式,它包含了若干更加基本的设计模式:组合(Composite),命令(Command),中介者(Mediator),策略(Strategy)和观察者(Observe)

2.1 几种常见设计模式介绍
2.1.1 组合:
视图对象之间以协作的方式构成一个视图层次体系,其中既可以有复合视图(比如表格视图),也可以有独立视图(比如文本框或按钮)。每个层次的每个视图节点都可以影响用户的操作并把自己绘制到屏幕上。

2.1.2 命令:
这是一种“目标-动作”机制,视图对象可以推迟其他对象(比如控制器)的执行,让其他对象等到发生了某些事件后再执行。

2.1.3 中介者:
控制器对象起着中间人的作用,它构成了在模型和视图对象之间传递数据的双向通道。应用程序的控制器对象将模型的变更传达给视图对象。

2.1.4 策略:
控制器是视图对象的一个“策略”,视图对象将自身隔离,以期维持其作为数据展示器的唯一职责,而将一切应用程序特有的界面行为的决定委派给它的“策略”对象(即控制器)。

2.1.5 观察者:
模型对象向它所关注的控制器等对象发出内部状态变化的通知。

2.2 协议与抽象类
2.2.1 针对接口编程
针对接口编程,而不是针对实现编程。

接口继承与类继承:

接口继承(子类型化):让我们可以用一个对象代替另一个对象。

类继承:通过复用父类的功能或者只是简单的共享代码和表述,来定义对象的实现和类型的一种机制。

定义具有相同接口的类群很重要,因为多态是基于接口的。Objective-C种有一种,确定了客户端同所用的具体类之间的一种“合约”的东西,叫做协议(protocol)。协议也是对象之间的一种合约,但是本身不能实例化伟对象。实现协议或者从抽象类继承,使得对象共享相同的接口。

通常的做法是:在客户端的代码中不声明特定具体类的变量,而只是使用协议或者抽象类定义的接口。

2.2.2 @protocol与抽象基类
协议的语法为@protocol,并不定义任何实现,而只是声明方法(method),以确定符合协议的类的行为。只定义了抽象行为的“接口”。实现协议的类定义这些方法的实现,以执行真正的操作。

另一种定义高度抽象类型的方法是定义抽象基类(Abstract Base Class,ABC)。通过抽象基类,我们可以生成一些其他自雷可以共享的默认行为。

协议中可以用@optional指令(directive)将协议部分方法变更为“可选的”。

如果客户端要使用由协议所定义类型的对象,比如有个协议叫Mark,则需要使用:

id<Mark>thisMark;

如果Mark被声明为抽象基类,那么语法应该分其他类一样:

Mark* thisMark;

Objective-C不支持多重继承,所以要用协议来进行扩展。

 

优先使用协议而不是类继承。

<think> 我们正在讨论LabVIEW面向对象编程(LVOOP)的难度分析。根据引用内容,我们可以总结出以下几点: 1. 引用[1]提到,LabVIEW的面向对象设计与其他文本编程语言存在差异,因此Stephen Loftus-Mercer编写了技术白皮书来帮助开发者理解这些差异,以便更好地适配LabVIEW编程语言。这表明,对于有其他面向对象编程经验的开发者来说,需要克服这些差异带来的学习曲线。 2. 引用[2]明确指出,该系列博文(门槛系列)并不适合学者,因为它涉及的是重构和实际工程中的经验,过早学习可能会让学者失去兴趣。这暗示了LabVIEW面向对象编程具有一定的难度,尤其是对于新手而言。 3. 引用[4]提到了装饰者模式在LabVIEW中的实现,这涉及到设计模式的应用,而设计模式本身是面向对象编程中较为高级的主题,需要一定的理解能力。 综合以上信息,我们可以从以下几个方面分析LabVIEW面向对象编程的难度: - **对于有面向对象编程经验的开发者**:由于LabVIEW是图形化编程语言,其面向对象的实现方式与文本语言(如C++、Java)有显著差异。因此,即使有面向对象编程经验,也需要重新适应LabVIEW的独特概念(如LabVIEW类、数据流编程等)。引用[1]中提到的技术白皮书就是为这类开发者准备的,以帮助他们理解差异。 - **对于LabVIEW学者**:引用[2]明确指出,面向对象编程的进阶内容(如设计原则、重构)不适合学者。因此,学者需要先掌握LabVIEW的基础编程(如数据流、VI、常用设计模式等)和基本的面向对象概念,再逐步过渡到面向对象编程。否则,可能会因为难度过高而失去兴趣。 - **设计模式的应用**:面向对象编程通常与设计模式紧密结合。引用[4]中展示的装饰者模式在LabVIEW中的实现,说明在LabVIEW中应用设计模式需要转换思维方式(从文本语言到图形化语言)。这对于开发者来说是一个挑战,需要深入理解设计模式以及LabVIEW的特性。 因此,我们可以将LabVIEW面向对象编程的难度归纳为: 1. **语言范式的转换**:从文本到图形化编程的转变,以及面向对象在图形化环境中的实现方式,需要时间适应。 2. **学习曲线**:对于没有面向对象基础的LabVIEW开发者,需要先学习面向对象的基本概念,再学习其在LabVIEW中的实现。而对于有面向对象基础的开发者,则需要理解LabVIEW的独特设计(如封装、继承、多态在LabVIEW中的表现)。 3. **高级主题的复杂性**:设计模式的应用、大型项目的重构等高级主题在LabVIEW中实现时,可能会遇到更多挑战,因为图形化编程在代码组织、抽象层次上的表达与文本语言不同。 不过,LabVIEW面向对象编程也有其优势,例如在数据流编程中引入面向对象可以更好地组织代码,提高模块化和可维护性。因此,尽管有难度,但掌握LVOOP对于开发复杂的LabVIEW应用程序是有益的。 §§相关问题§§ 1. LabVIEW面向对象编程适合哪些类型的项目? 2. 如何从零开始学习LabVIEW面向对象编程? 3. LabVIEW面向对象编程与文本语言(如C++)的面向对象编程主要区别是什么? </think> ### LabVIEW面向对象编程的难度分析 LabVIEW面向对象编程(LVOOP)的难度可从以下维度分析: #### 1. **学习曲线特征** - **图形化思维转换**:传统文本编程开发者需适应数据流驱动的图形化编程范式,类/继承等概念需映射到LabVIEW的接线板、VI图标等元素[^1][^2]。 - **概念迁移成本**:有面向对象(OO)经验的开发者需重点学习LVOOP的特殊设计决策(如动态分发机制、LabVIEW类存储方式),这些与C++/Java等语言存在显著差异[^1]。 - **基础依赖强**:需先掌握LabVIEW核心技能(VI架构、数据类型、事件处理),否则直接接触LVOOP易导致挫败感[^2]。 #### 2. **典型难点分布** | 难度层级 | 内容示例 | 挑战点 | |----------|----------|--------| | **级** | 封装基础类 | 属性/方法在接线板的视觉化表达 | | **中级** | 继承/多态 | 动态分发VI的调试技巧 | | **高级** | 设计模式应用 | 装饰者/工厂模式在数据流中的实现[^4] | #### 3. **复杂度来源** - **动态行为调试**:多态调用在并行数据流中可能引发非预期交互,调试工具使用门槛高。 - **性能优化**:不当的类设计易导致内存拷贝(如大型数组嵌套在类中),需深入理解LabVIEW内存机制。 - **模式适配**:文本语言的经典设计模式(如装饰者模式)需重构为数据流友好形式[^4]。 #### 4. **学习建议** 1. **分阶学习路径** ```mermaid graph LR A[LabVIEW基础] --> B[简单类封装] B --> C[继承/多态] C --> D[接口应用] D --> E[设计模式重构] ``` 2. **关键避坑指南** - 避免过早接触复杂模式(如引用[2]警告:直接学习高级内容易丧失兴趣) - 优先使用**LabVIEW类设计工具**(New>>LabVIEW Class)而非手动创建 - 多态VI调试时启用"显示动态调用分派" > 经验表明:有文本OO背景者平均需2-3周适应期,纯LabVIEW开发者系统学习需8-12周[^1][^3]。实际工程中,LVOOP在大型测试系统/硬件抽象层开发中能显著提升代码复用率,但需权衡期学习投入与长期维护收益。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值