`

javaScript设计模式之代理模式实例解读

阅读更多

维基百科对代理模式的解释是:

代理模式(英语: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的核心技术点,涵盖高质量编码技巧、函数应用、上下文机制等基础知识,同时对JavaScript中的经典设计模式做了详尽的阐述,如单例、构造函数模式及多种复合模式的应用实例。...

    Learning JavaScript Design Patterns.pdf

    《Learning JavaScript Design Patterns》是Addy Osmani所著,本书在2016年5月2日保存,涵盖了JavaScript设计模式的相关知识。JavaScript设计模式是一系列被定义为软件设计中常见问题的可重用解决方案。设计模式既令...

    javascript设计模式之module(模块)模式

    对象字面量不需要使用new运算符进行实例化,但不能用在一个语句的开头,因为开始的可能被解读为一个块的开始,在对象的外部,新成员可以使用如下赋值语句添加到对象字面量上,myModule.property = “someValue”。...

    JavaScript正则表达式验证登录实例

    JavaScript正则表达式是JavaScript编程语言中一种用来进行...以上就是对JavaScript正则表达式验证登录实例的详细解读。这个示例虽然简单,但其中所涉及的概念和方法可以广泛应用于各类需要输入验证的Web应用开发之中。

    jQuery源码解读

    在源码解读中,我们可以看到jQuery的设计思路和实现机制。 首先,jQuery的核心设计是基于JavaScript的闭包特性,以避免命名冲突。整个jQuery库被包裹在一个立即执行的匿名函数中,这样可以确保其中定义的所有函数和...

    javascript基础教程 第8版 源代码.

    "javascript基础教程 第8版 源代码" 暗示这是一份关于JavaScript编程语言的基础教程的源代码,可能是书籍《javascript基础教程》的第八版中的实例代码或者练习项目。这份资源可能包含了一系列用于教学和学习...

    《javascript脚本》课程标准.pdf

    本文档是一份关于《javascript脚本》课程的标准文件,主要包含了课程的基本信息、设计理念、教学目标、内容要求以及实施条件等重要知识点。下面将详细解读这些知识点。 课程基本信息部分涵盖了课程编码、类别、适用...

    项目中要用到的小实例

    标签“源码”意味着我们将讨论与代码相关的知识,可能包括编程语言的语法、设计模式、算法实现等。而“工具”则可能涉及到开发过程中使用的各种辅助软件、框架、库或者命令行工具等,它们能提高开发效率,优化工作...

    9实例源码分析以及开源分析+集合打包2.zip

    源码分析是程序员提升技能的重要途径,通过阅读和理解别人的代码,可以学习到新的编程思想、设计模式和最佳实践。这9个实例可能涵盖不同的编程语言,如Java、Python、C++或JavaScript,每个实例都可能解决一个特定的...

    Q189396实例代码

    良好的代码结构和设计模式可以使代码更容易理解和修改,适应未来的需求变化。此外,遵循编程规范和最佳实践,如适当的变量命名、错误处理、资源管理等,也是保证代码质量的重要方面。 综上所述,"Q189396实例代码...

    prototype-1.4.0源码解读.js

    通过分析Prototype 1.4.0的源码,我们可以更深入地理解JavaScript的设计模式和最佳实践,提升我们的编程技巧。尽管随着技术的发展,新的库和框架层出不穷,但Prototype的许多设计理念和方法仍被广泛借鉴,对学习和...

    Jquery 源码解读

    jQuery 使用了一种常见的面向对象模式来定义类及其实例。具体而言,它定义了一个构造函数,并在原型对象上扩展了一些方法。 例如,jQuery 的构造函数如下所示: ```javascript var jQuery = function(selector, ...

    PHP高级Web开发框架Swoole深入解读+实战案例

    4. **客户端开发**:通过JavaScript等前端技术实现用户界面交互功能,并借助WebSocket API与后端建立双向通信通道。 5. **性能优化**:针对可能出现的性能瓶颈点进行优化调整,比如通过增加缓存层降低数据库访问频率...

    JavaScript中创建对象和继承示例解读

    JavaScript是一种动态类型的脚本语言,广泛应用于Web开发。在JavaScript中,对象的创建和继承是其面向对象...理解这些概念对于编写高效的JavaScript代码至关重要,特别是在处理复杂对象结构和实现面向对象设计模式时。

    Flash赛车游戏实例含源码文件.rar

    本实例中的"Flash赛车游戏"是Flash早期游戏编程的经典之作,通过源码分析,我们可以深入理解Flash游戏开发的核心技术和设计理念。 首先,源码文件提供了完整的开发流程,包括游戏逻辑设计、图形绘制、用户交互以及...

    PHP实例开发源码——php打造简易个人网站系统.zip

    这通常包括用户登录、注册、页面展示、数据处理等功能的实现,可能使用了PHP的基础语法、MVC(模型-视图-控制器)设计模式,以及数据库交互。 【标签】:“php”表明这个项目专注于PHP技术,PHP是一种广泛使用的...

    PHP实例开发源码—飞虎统计.zip

    12. **RESTful API设计**:如果项目支持API,那么可能遵循REST原则设计接口,进行JSON数据交换。 13. **缓存技术**:如使用Redis或Memcached提高数据访问速度。 14. **日志记录**:记录应用程序的运行信息,方便...

    微信课程考核小程序明朝历史解读

    7. **项目实践**:通过“明朝历史解读”的实例,你可以学习如何将历史资料转化为吸引人的交互内容,如时间线展示、人物介绍、事件解读等,同时锻炼编程和设计能力。 8. **考核机制**:课程可能设有考核环节,以评估...

    PHP实例开发源码—CakePHP(PHP的框架).zip

    CakePHP是基于MVC(Model-View-Controller)设计模式的开源PHP框架,它遵循敏捷开发原则,旨在简化开发流程并提高代码的可维护性。MVC模式将应用程序的业务逻辑、数据处理和用户界面分离,使开发更易于理解和管理。 ...

Global site tag (gtag.js) - Google Analytics