设计模式之module模式及其改进

写在前面

编写易于维护的代码,其中最重要的方面就是能够找到代码中重复出现的主题并优化他们,这也是设计模式最有价值的地方

《head first设计模式》里有一篇文章,是说使用模式的心智,

  1、初学者"心智" :"我要为HELLO WORLD找个模式"

  2、中级人员模式: "或许这里我需要一个单件模式"

  3、悟道者心智:"在这里使用一个装饰者模式相当自然"

  but,but,but,不学,连初学者都不算呐...  

  先了解一下设计模式的起源吧:

    >>>设计模式最初起源于奥地利维也纳的一个土木工程师克里斯托弗·亚历山大,模式语言最早是为了解决复杂工程项目而创立的,30年前,软件开发工程师们的开始把亚历山大编写的设计原则纳入首个设计模式的文档中。

    >>>1995年,出版了《设计模式:可复用面向对象软件的基础》,就这样经过开发工程师们的经验的总结与使用,成长成为今天的设计模式,已经得到了广泛的使用,是初级开发人员改进编程技巧的指南。

Module(模块)模式

  模块是任何强大的应用程序框架中不可或缺的一部分,也是在程序框架中应用比较广泛的模式,他帮助我们清楚的分离组织项目中代码单元

  在module模式中,,可以使一个对象拥有共有/私有方法和变量,从而屏蔽来自全局作用域的特殊部分

  我们来一艘卡通版的module~

  相信聪明的你已经观察出来了,在module模式中,有两个重要的点就是公有私有 ,

module模式提供了一种混合公有/私有方法和变量的方式,防止其泄露至全局作用域,并与别的开发人员接口发生冲突,

  通过该模式,只需返回一个公有的API,而其他的一切都维持在私有闭包里。

  我们来写一个简单的示例:<通过module模式实现一个购物车>

 在module模式中,我们注意到了,我们返回了一个object对象。他会自动赋值给basketModule,以便我们可以与他交互.

我们的函数能够享有私有函数的自由,因为他们不会暴露于页面的其他部分,

  当我们试着输出console.log(basket) ,发现不能正常工作,因为basket只存在basketModule闭包的作用域中,而不是存在于返回的公有对象里。

 Module模式变化

1、引入混入

  模式的引入混入变化演示了全局变量如何作为参数传递给模块的匿名函数,如果你想在你的模式中使用jQuery或者underscore等等中的方法

  通过全局变量(jQuery、underscore)传递参数给模块的方式来使用全局变量中的方法。

 2、引出

  我们声明一个全局变量,而不需要使用他。然后接下来你用样可以使用引入混入的方法引入该全局变量

  我们在控制台输出myModule,里面已经存在了一公有变量和方法,   但是module,privateVariable、privateMethod对外仍然是不可见的,这样也保持了全局变量的纯洁性

Revealing module(揭示)模式

我们理解了module模式之后,我们来看一个稍有改进的版本 — —Revealing module模式:

Revealing module的关键在于:将暴露的公有指针指向私有函数和属性上

Heilmann创建的这种改进版的module模式,可以使脚本语法更加一致。在模板代码的底部,他很容易指出哪些函数和变量可以被公开访问,从而改善可读性

但是Revealing module 相比 module模式创建的模块更加脆弱,所以使用时应特别小心(ヽ( ̄▽ ̄)و,hey,我会注意)

写在后面

  module模式的优势是很明显的,它支持私有数据,在module模式中代码的公有部分能够接触私有部分,而外界无法接触类的私有部分。

  那么module模式有哪些缺点呢?由于我们访问公有和私有成员的方式不同,当我们想要改变可见性时,我们就需要修改每一个曾经使用过该成员的地方。还有其他的一些缺点

  虽然如此module仍然是相当有用的。

参考书籍:

  《JavaScript设计模式》   《head first设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

半同步半异步模式以及Leader_Follwer模式

这里提到的两个设计模式都是用于高并发系统(例如一个高性能的网络服务器)的。这里我只是简单地提一下:    1. 半同步/半异步(half-sync/half-...

752
来自专栏程序之美

第一节 DDD领域驱动概述

总结出一个原则:分析设计层面和实现层面完全是两个独立的层面,即使实现层面通过某种技术手段可以把两个完全独立的概念合二为一,在分析设计层面,我们仍然(至少在头脑中...

683
来自专栏ThoughtWorks

在项目中透明地引入特性开关

之前曾经推荐过崔立强的《使用功能开关更好地实现持续部署》,介绍Feature Toggle的实践。北京办公室的孟宇现在对这个问题有了新的思考,当我们抛却Spri...

3086
来自专栏ThoughtWorks

TW洞见|也谈响应式编程

本文将会围绕reactive extension介绍reactive programming的起源,其要解决的问题。 编程范式的演进 最近几年,reactiv...

3466
来自专栏java一日一条

为什么用 Java:一个 Python 程序员告诉你

说实话,本人刚开始的时候也是同样的反应。但是由于Java的类型安全,执行性能和坚如磐石的工具,我渐渐地开始欣赏Java。同时我注意到,现在的Java已今非昔比—...

341

为什么我们从Python切换到Go?

切换到新的编程语言向来是关键一步,尤其是当你的团队只有一位成员有该语言的使用经验时。今年年初,我们将 Stream 的主要编程语言从Python 切换到 Go。...

1002
来自专栏nimomeng的自我进阶

Swift 4.2新特性——WWDC2018 Session401笔记

厨子今年的演讲很不给力。不过既然是软件开发者大会嘛,焦点自然应该放在软件功能上。 所以我看了下今年的Session401,也就是Swift4.2新特性介绍,做...

1092
来自专栏纯洁的微笑

【重磅】Spring Boot 2.0权威发布

就在今天Spring Boot 2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2...

3645
来自专栏PHP技术

PHP - Yaf的介绍

Yaf是一个C语言编写的PHP框架 Yaf的特点 剑的三层境界:一是手中有剑,心中亦有剑;二是手中无剑,心中有剑;三是手中无剑,心中亦无剑 在和其他用PHP写的...

3049
来自专栏互联网高可用架构

分布式服务化系统一致性的“最佳实干”

1505

扫码关注云+社区