• JavaScript 设计模式


    <!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>设计模式</title>
        <script src="jquery.min.js"></script>
    </head>
    <body>
        <button id="btn">click</button>
       <script>
    	//原始模式
        var person = new Object();
        person.name ='ben';
        person.showName= function(){
            console.log(this.name)
        };
        person.showName();
    
        //工厂模式
        // function person(name,age){
        //     var obj = new Object();
        //     obj.name = name;
        //     obj.age = age;
        //     obj.showName = function(){
        //         return this.name
        //     }
        //     return obj;
        // };
        // var p1 = person('a1',20);
        // var p2 = person('a2',20);
        //缺点:全部都是object   date  array
    
        //构造函数模式
        function Person(name,age){
            this.name = name;
            this.age = age;
            this.showName = function(){
                return this.name
            }
        };
        var p1 = new Person('a1',20);
        var p2 = new Person('a2',20);
        //缺点:每次创建实例时都要重新创建一次方法
    
        function Person(name,age){
            this.name = name;
            this.age = age;
            this.showName = showName;
        };
        function showName(){
            return this.name
        }
        var p1 = new Person('a1',20);
        var p2 = new Person('a2',20);
    
        //混合模式(原型模式+构造函数模式)
        function Person(name,age){
            this.name = name;
            this.age = age;
            //this.showName = showName;
        };
        Person.prototype.showName = function(){
            return this.name
        }
        var p1 = new Person('a1',20);
        var p2 = new Person('a2',20);
    
        //单例模式(单体模式)   只有一个实例
        // function createWindow() {
        //     var div = document.createElement("div");
        //     div.innerHTML="hello world";
        //     div.style.display = "none";
        //     document.body.appendChild(div);
        //     return div;
        // };
        var createWindow = (function() {
            var div;
            return function (){
                if(!div){
                    div = document.createElement("div");
                    div.innerHTML="hello world";
                    div.style.display = "none";
                    document.body.appendChild(div);
                };
                return div;
            }
        })();
    	document.getElementById("btn").onclick = function() {
            var str = createWindow();
            str.style.display ='block';
        };
    
        //观察者模式(订阅模式)
        //1、发布 者(卖家)
        //2、发布者添加一个缓存列表(用于存入订阅者回调函数)
        //3、发布 消息,遍历缓存列表,依次触发订阅者的回调函数
        var obj ={}; //卖家
        obj.list = [];  //缓存列表
        obj.listen = function(fn) {   //订阅者信息(增加)
            obj.list.push(fn);
        };
        obj.trigger = function(){   //发布消息
            // for(var i=0,fn;fn=this.list[i++];){
            //     fn.apply(this,arguments);
            // }
            for(var i=0;i<this.list.length;i++){
                var fn;
                fn = this.list[i];
                //fn这个函数在当前对象中调用
                fn.apply(this,arguments);   //arguments内置的属性 类似是Array  
            }
        };
        //小红订阅消息
        obj.listen(function(color,size){
            console.log('姓名'+'小红');
            console.log('颜色'+color);
            console.log('尺寸'+size);
        });
        //小明订阅消息
        obj.listen(function(color,size){
            console.log('姓名'+'小明');
            console.log('颜色'+color);
            console.log('尺寸'+size);
        });
        //发布消息
        obj.trigger('红色','s');
    
        //适配器模式
        //自行车 bike    人驱动 Hdrive
        //电动车  Ebile   电驱动 Edrive
    
        //自行车抽象类   便于扩展功能
        var Bike = function() {}
        Bike.prototype.wheel = function() {
            throw new Error("错误")   //自定义错误信息
        };
        Bike.prototype.Hdrive= function() {
            throw new Error("错误")
        };
        //电动车抽象类   便于扩展功能
        var Ebile = function() {}
        Ebile.prototype.wheel = function() {
            throw new Error("错误")
        };
        Ebile.prototype.Edrive= function() {
            throw new Error("错误")
        };
    
        //自行车的实现类
        var RealizeBike = function() {}
        RealizeBike.prototype = new Bike(); //继承
        RealizeBike.prototype.wheel = function() {
            console.log('我有二个轮子')
        };
        RealizeBike.prototype.Hdrive= function() {
            console.log('人驱动')
        };
        //电动车的实现类
        var RealizeEbile = function() {}
        RealizeEbile.prototype = new Ebile(); //继承
        RealizeEbile.prototype.wheel = function() {
            console.log('我有二个轮子')
        };
        RealizeEbile.prototype.Edrive= function() {
            console.log('电驱动')
        };
    
        //自行车适配器
        var BikeAdapter = function(o) {
            //Ebile.apply(this);
            this.o = o;
        };
        BikeAdapter.prototype = new Ebile();//继承
        BikeAdapter.prototype.Edrive= function() {
            console.log(this.o);
            console.log(this.o.wheel());
    		//console.log(this.o.Hdrive());
        };
        var b1 = new RealizeBike();  //实例化自行车
        //b1.Hdrive();//人驱动
        var e1 = new RealizeEbile();  //实例化电动车
        //e1.Edrive(); //电驱动
        //适配器自行车的行为
        var aa = new BikeAdapter(b1);
        aa.Edrive();
    
    
       </script>
    </body>
    </html>
    
    

    本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。

    博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。

    博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的文章,请原谅博主成为一个无耻的文档搬运工!

  • 相关阅读:
    Mybatis 原始dao CRUD方法
    JQuery的焦点事件focus() 与按键事件keydown() 及js判断当前页面是否为顶级页面 子页面刷新将顶级页面刷新 window.top.location
    使用actionerror做失败登录验证
    Java项目中的下载 与 上传
    shiro框架 4种授权方式 说明
    javascript 中数组的创建 添加 与将数组转换成字符串 页面三种提交请求的方式
    序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询
    Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 三种处理方法
    orcal 数据库 maven架构 ssh框架 的全注解环境模版 maven中央仓库批量删除lastupdated文件后依然是lastupdated解决方法 mirror aliyun中央仓库
    EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法
  • 原文地址:https://www.cnblogs.com/Dewumu/p/14440334.html
Copyright © 2020-2023  润新知