zoukankan      html  css  js  c++  java
  • 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>
    
    

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

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

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

  • 相关阅读:
    02(c)多元无约束优化问题-牛顿法
    02(b)多元无约束优化问题-最速下降法
    数据仓库建模指南系列教程学习笔记
    ML_Gradient ascent algorithm for learning logistic regression classifier
    ML_聚类之Nearest neighbor search
    ML_Clustering & Retrieval(一)
    复习_git教程
    Predicting sentiment from product reviews情感预测
    ML_classification_intro
    ML_classification
  • 原文地址:https://www.cnblogs.com/Dewumu/p/14440334.html
Copyright © 2011-2022 走看看