维基百科对代理模式的解释是:
代理模式(英语:Proxy Pattern)是程式設計中的一種設計模式。
所謂的代理者是指一個類別可以作為其它東西的介面。代理者可以作任何東西的介面:網路連接、記憶體中的大物件、檔案或其它昂貴或無法複製的資源。
著名的代理模式例子為參照計數(英语:reference counting)指標物件。
當一個複雜物件的多份副本須存在時,代理模式可以結合享元模式以減少記憶體用量。典型作法是建立一個複雜物件及多個代理者,每個代理者會參照到原本的複雜物件。而作用在代理者的運算會轉送到原本物件。一旦所有的代理者都不存在時,複雜物件會被移除。
接下来我们以一个实例来说明
案例引入
A类用户:可读、可写、可编辑、可删除
B类用户:可读、可写、可编辑
C类用户:可读、可写
D类用户:只读
我们现在需要对这些类用户做权限分配
那么一般的做法是在用户的各种行为中加入权限的判断,有权限的就通过,无权限的则输出警告:
function user(name, classs) { this.name = name; this.classs = classs; } user.prototype = { read: function () { console.log('读取成功'); } , write: function () { if (this.classs != 'D') { console.log('写入成功'); } else { console.warn('无权限写入'); } } , edit: function () { if (this.classs === 'A' || this.classs === 'B') { console.log('编辑成功'); } else { console.warn('无权限编辑'); } } , delete: function () { if (this.classs === 'A') { console.log('删除成功'); } else { console.warn('无权限删除') } } }
看起来好像没什么问题,貌似很好用,但是实际的开发中,不管是用户行为的设计(读取写入删除等),还是用户权限的分配往往都是非常复杂的,如果按照这种写法到了后期可能就会带来一些维护上的不便,我们需要将行为的设计和权限的分配分离开来,这个时候就可以使用代理模式对以上代码进行优化。
构建用户类:
function User(name, classs) { this.name = name; this.classs = classs; }
创建用户行为:
User.prototype = { getname: function () { return this.name; } , getclasss: function () { return this.classs; } , read: function () { console.log('读取成功'); } , write: function () { console.log('写入成功'); } , edit: function () { console.log('编辑成功'); } , delete: function () { console.log('删除成功'); } }
行为权限的分配:
function User_work(user){ this.user=user; } User_work.prototype={ getuser:function(){ return this.user; } , read: function () { return this.user.read(); } , write: function () { if(this.user.getclasss()!='D'){ return this.user.write(); } console.warn('无权限写入'); } , edit: function () { if(this.user.getclasss()==='B'||this.user.getclasss()==='A'){ return this.user.edit(); } console.warn('无权限编辑'); } , delete: function () { if(this.user.getclasss()==='A'){ return this.user.delete(); } console.warn('无权限删除') } }
接下来各个用户就可以开始工作了
new User_work(new User('likeke','C')).delete();//无权限删除 new User_work(new User('likeke','C')).write();//写入成功 new User_work(new User('likeke','C')).edit();//无权限编辑
当然,我们也可以创建一个统一的函数来简化上面调用的操作
function startWork(name,classs){ if(name && classs){ return new User_work(new User(name,classs)); } }
开始工作:
startWork('likek','B').delete();//无权限删除 startWork('likek','B').edit();//编辑成功 startWork('likek','B').write();//写入成功 startWork('likek','B').read();//读取成功
现在,如果我们需要修改用户的某种行为细节,那么只需要修改User类的原型里面的对应一项;如果我们需要对用户某种行为的权限分配或者越权处理做修改,就只需要修改User_work类的原型中对应的那一项。
相关推荐
本文系统性梳理并深入探讨了JavaScript的核心技术点,涵盖高质量编码技巧、函数应用、上下文机制等基础知识,同时对JavaScript中的经典设计模式做了详尽的阐述,如单例、构造函数模式及多种复合模式的应用实例。...
《Learning JavaScript Design Patterns》是Addy Osmani所著,本书在2016年5月2日保存,涵盖了JavaScript设计模式的相关知识。JavaScript设计模式是一系列被定义为软件设计中常见问题的可重用解决方案。设计模式既令...
对象字面量不需要使用new运算符进行实例化,但不能用在一个语句的开头,因为开始的可能被解读为一个块的开始,在对象的外部,新成员可以使用如下赋值语句添加到对象字面量上,myModule.property = “someValue”。...
JavaScript正则表达式是JavaScript编程语言中一种用来进行...以上就是对JavaScript正则表达式验证登录实例的详细解读。这个示例虽然简单,但其中所涉及的概念和方法可以广泛应用于各类需要输入验证的Web应用开发之中。
在源码解读中,我们可以看到jQuery的设计思路和实现机制。 首先,jQuery的核心设计是基于JavaScript的闭包特性,以避免命名冲突。整个jQuery库被包裹在一个立即执行的匿名函数中,这样可以确保其中定义的所有函数和...
"javascript基础教程 第8版 源代码" 暗示这是一份关于JavaScript编程语言的基础教程的源代码,可能是书籍《javascript基础教程》的第八版中的实例代码或者练习项目。这份资源可能包含了一系列用于教学和学习...
本文档是一份关于《javascript脚本》课程的标准文件,主要包含了课程的基本信息、设计理念、教学目标、内容要求以及实施条件等重要知识点。下面将详细解读这些知识点。 课程基本信息部分涵盖了课程编码、类别、适用...
标签“源码”意味着我们将讨论与代码相关的知识,可能包括编程语言的语法、设计模式、算法实现等。而“工具”则可能涉及到开发过程中使用的各种辅助软件、框架、库或者命令行工具等,它们能提高开发效率,优化工作...
源码分析是程序员提升技能的重要途径,通过阅读和理解别人的代码,可以学习到新的编程思想、设计模式和最佳实践。这9个实例可能涵盖不同的编程语言,如Java、Python、C++或JavaScript,每个实例都可能解决一个特定的...
良好的代码结构和设计模式可以使代码更容易理解和修改,适应未来的需求变化。此外,遵循编程规范和最佳实践,如适当的变量命名、错误处理、资源管理等,也是保证代码质量的重要方面。 综上所述,"Q189396实例代码...
通过分析Prototype 1.4.0的源码,我们可以更深入地理解JavaScript的设计模式和最佳实践,提升我们的编程技巧。尽管随着技术的发展,新的库和框架层出不穷,但Prototype的许多设计理念和方法仍被广泛借鉴,对学习和...
jQuery 使用了一种常见的面向对象模式来定义类及其实例。具体而言,它定义了一个构造函数,并在原型对象上扩展了一些方法。 例如,jQuery 的构造函数如下所示: ```javascript var jQuery = function(selector, ...
4. **客户端开发**:通过JavaScript等前端技术实现用户界面交互功能,并借助WebSocket API与后端建立双向通信通道。 5. **性能优化**:针对可能出现的性能瓶颈点进行优化调整,比如通过增加缓存层降低数据库访问频率...
JavaScript是一种动态类型的脚本语言,广泛应用于Web开发。在JavaScript中,对象的创建和继承是其面向对象...理解这些概念对于编写高效的JavaScript代码至关重要,特别是在处理复杂对象结构和实现面向对象设计模式时。
本实例中的"Flash赛车游戏"是Flash早期游戏编程的经典之作,通过源码分析,我们可以深入理解Flash游戏开发的核心技术和设计理念。 首先,源码文件提供了完整的开发流程,包括游戏逻辑设计、图形绘制、用户交互以及...
这通常包括用户登录、注册、页面展示、数据处理等功能的实现,可能使用了PHP的基础语法、MVC(模型-视图-控制器)设计模式,以及数据库交互。 【标签】:“php”表明这个项目专注于PHP技术,PHP是一种广泛使用的...
12. **RESTful API设计**:如果项目支持API,那么可能遵循REST原则设计接口,进行JSON数据交换。 13. **缓存技术**:如使用Redis或Memcached提高数据访问速度。 14. **日志记录**:记录应用程序的运行信息,方便...
7. **项目实践**:通过“明朝历史解读”的实例,你可以学习如何将历史资料转化为吸引人的交互内容,如时间线展示、人物介绍、事件解读等,同时锻炼编程和设计能力。 8. **考核机制**:课程可能设有考核环节,以评估...
CakePHP是基于MVC(Model-View-Controller)设计模式的开源PHP框架,它遵循敏捷开发原则,旨在简化开发流程并提高代码的可维护性。MVC模式将应用程序的业务逻辑、数据处理和用户界面分离,使开发更易于理解和管理。 ...