设计模式

1、单例模式

一个类提供一个实例,并且暴露出一个全局访问点也就是闭包

案列:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<script>
    function ts(name){
        this.name=name;
    }
    //给上面的方法添加原型属性或方法
    ts.prototype.getName=function(){
        return this.name;
    };
    //自执行  执行函数  返回闭包的对象
    /*
     * 这个就是一个单例方法
     * */
    var object=(function(){
        var instance = null;
        return function (name) {
            if (!instance) {
                instance = new ts(name);
            }
            //该函数的返回值对象   返回一个单独的对象
            return instance;
        }
    })();
    //调用单例模式
    console.log(object("张三").getName());//张三
    console.log(object("李四").getName());//张三
    console.log(object("王麻子").getName());//张三
</script>
</body>
</html>

结果:

设置多个类对象将单例的方法抽象为一个共享方法

callback为回调函数,这个共享方法不适用自执行

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<script>
    function ts(name){
        this.name=name;
    }
    //给上面的方法添加原型属性或方法
    ts.prototype.getName=function(){
        return this.name;
    };
    var getInstance = function (callback) {
        var instance = null;
        return function () {
            if (!instance) {
                //实例化对象
                //apply  替换函数内部的this指针  执行前面的函数
                //this   指向window  可以可不写
                //console.log(this);
                instance = callback.apply(null, arguments);
            }
            return instance;
        }
    };

    console.log(getInstance(function () {
        console.log(arguments);
        var per = new ts("李四");
        return per;
    })().getName());
    console.log(getInstance(function () {
        var per = new ts("王麻子");
        return per;
    })().getName());


    function animale(name,age){
        this.name=name;
        this.age=age;
    }
    animale.prototype.getName=function (){
        return this.name;
    };

    console.log(getInstance(function () {
        var name = arguments[0];
        var age = arguments[1];
        var dog = new animale(name, age);
        return dog;
    })("小狗", 2).getName());
</script>
</body>
</html>

2、策略模式

将算法和算法的使用分离开来

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<script>
    var level = {
        S: 8,
        A: 6,
        B: 5,
        C: 3,
        D: 1
    };

    //策略的使用
    var levelScore = {
        base: 60,
        S: function () {
            return this.base + level["S"];
        },
        A: function () {
            return this.base + level["A"];
        },
        B: function () {
            return this.base + level["B"];
        },
        C: function () {
            return this.base + level["C"];
        },
        D: function () {
            return this.base + level["D"];
        }
    };
    //计算得分情况
    function getScore(score, levela) {
        levelScore.base = score;
        return levelScore[levela]();
    }
    console.log(getScore(90, "S"));
    console.log(getScore(80, "A"));
    console.log(getScore(70, "B"));
    console.log(getScore(60, "C"));
    console.log(getScore(50, "D"));
</script>
</body>
</html>

结果:

3、使用策略模式写表单验证

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<script>
    //错误信息提示
    var errormessage={
        format:"输入格式不正确!",
        minlength:"输入过短!",
        number:"输入数字!",
        empty:"输入不能为空!",
        maxlength:"输入过长!"
    };
    //策略集
    var rule={
        format:function(value,error){
            if(!/^\w+$/.test(value)){
                return error||errormessage["format"];
            }
        },
        minlength:function(value,length,error){
            if(value.length<length){
                return error||errormessage["minlength"];
            }
        },
        number:function(value,error) {
            if (!/^\d+$/.test(value)) {
                return error || errormessage["number"];
            }
        },
        empty:function(value,error){
            if(value ==""){
                return error|| errormessage["empty"];
            }
        },
        maxlength:function(value,length,error){
            if(value.length>length){
                return error||errormessage["maxlength"];
            }
        }
    };
    //写一个验证类
    function storage(){
        this.item=[];//存储验证的函数
    }
    storage.prototype={
        constructor:storage,
        add:function(value,rules,error){
            var arg=[value];

            //找是否有:
            if(rules.indexOf(":")!==-1){
                var arr=rules.split(":");//以冒号截断
                arg.push(arr[1]);
                rules=arr[0];
            }
            arg.push(error);
            //开始验证
            this.item.push(function () {
                return rule[rules].apply(this, arg);
            });
        },
        start: function () {
            for (var i = 0; i < this.item.length; i++) {
                var error = this.item[i]();
                if (error) {
                    console.log(error);
                }
            }
        }
    };
    //实例化验证的对象
    //添加验证规则
    var ts = new storage();
    ts.add("1234", "minlength:5", "长度不小于5位!");
    ts.add("1234567891011", "maxlength:10", "长度在5-10位之间!");
    ts.add("", "empty", "输入的值不能为空!");
    ts.add("abc1245", "number", "输入的值必须为数字!");
    ts.add("abc1245as+", "format", "输入的格式必须为数字、字母、下划线!");
    ts.start();



</script>
</body>
</html>

结果:

4、订阅模式

观察者模式     原生js里面的事件就是订阅模式

观察者

1、集合存储订阅(就是一个人订阅一个或者订阅多个)

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<script>
    var observer = {
        subscribes: [],//订阅集合
        //订阅的方法
        subscribe: function (types, fn) {
            //检测types有没有订阅
            if (!this.subscribes[types]) {
                //创建订阅
                this.subscribes[types] = [];
            }
            //处理订阅的fn
            /*if(typeof fn=="function")
             {
             this.subscribes[types].push(fn);
             }*/
            typeof fn == "function" && this.subscribes[types].push(fn);
        },
        //执行订阅
        publish: function () {
            //检测当前的订阅是否存在
            var types = [].shift.call(arguments);//获取订阅着
            var fns = this.subscribes[types];
            //var name = [].shift.call(arguments).name;//获取订阅函数名称
            if (!fns || fns.length == 0) {
                return;
            }
            //开始执行
            var args = arguments;
            fns.forEach(function (handle) {
                console.log(handle.name);
                //handle.name  获取当前函数名称
                /* handle.name == name &&*/ handle.apply(this, args);
            });
            /*  for (var i = 0; i < fns.length; i++) {
             fns[i].apply(this, arguments);
             }*/
        },
        //删除订阅
        remove: function (types, fn) {
            //检测types  不存在  直接全部订阅移除
            if (!types) {
                this.subscribes = [];
                return;
            }
            //获取当前的订阅集合
            var fns = this.subscribes[types];

            if (!fns || fns.length == 0) {
                return;
            }
            //检测fn
            if (typeof  fn !== "function") {
                return;
            }
            //删除订阅
            fns.forEach(function (handle, index) {
                if (handle == fn) {
                    fns.splice(index, 1);
                }
            });
        }
    };

    /*
     * 模拟  maodou  定飞机票   火车票
     * */
    function getPiao(res) {
        console.log("订购:", res);
    }
    function getHose(res) {
        console.log("订:", res, "酒店");
    }
    observer.subscribe("maodou", getPiao);
    observer.subscribe("maodou", getHose);
    observer.subscribe("maodou", function () {
        console.log("先去吃饭!");
    });

    console.log(observer.subscribes);

    //执行订阅
    observer.publish("maodou", ["飞机票", "火车票"]);
    observer.publish("maodou", "速8");

    observer.remove("maodou", getHose);
    console.log(observer.subscribes);
</script>
</body>
</html>

结果:

 

 

2、代练代打案例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<script>
    /*
     * 订阅模式
     * */
    function Observer(name, level) {
        this.name = name;
        this.level = level;
        this.list = [];//订阅集合
    }
    //使用原型方法
    Observer.prototype.subscribe = function (target,fn) {
        //直接订阅
        target.list.push(fn);
    };
    //执行订阅
    Observer.prototype.publish = function (money) {
        this.list.forEach(function (handle) {
            handle.call(this, money);
        });
    };

    //实例化猎人
    var per1=new Observer("小蓝","白金");
    var per2=new Observer("小白","黄金");
    var per3=new Observer("小黑","王者");
    var per4=new Observer("小黄","青铜");//这个打一个怪  打不过  悬赏200金  找人打

    //订阅任务
    per1.subscribe(per4,function (money){
        console.log("小蓝"+(money>200?"愿意接单!":"不愿接单!"));
    });
    per2.subscribe(per4,function (money){
        console.log("小白"+(money>100?"愿意接单!":"不愿接单!"));
    });
    per3.subscribe(per4,function (money){
        console.log("小黑"+(money>300?"愿意接单!":"不愿接单!"));
    });

    console.log(per4.list);

    //执行订阅
    per4.publish(200);


</script>
</body>
</html>

结果:

 

 

 

简单的发布订阅:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<script>
    /*
     * 事件
     * */
    var ts = {
        kobe: [],
        //订阅
        addEventListener: function (type, callback) {
            if (!this.kobe[type]) {
                this.kobe[type] = [];
            }
            typeof  callback == "function" && this.kobe[type].push(callback);
        },
        //执行
        click: function () {
            var fns = this.kobe["click"];
            for (var i = 0; i < fns.length; i++) {
                fns[i]();
            }
        }
    };

    ts.addEventListener("click",function (){
        console.log("ts 的单机事件");
    });
    ts.addEventListener("click",function (){
        console.log("ts 的单机事件1");
    });
    ts.click();
</script>
</body>
</html>

结果:

 

 

 

简单的拷贝继承

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<script>
    /*
     * 父类
     * */
    function Person(){
        this.name="张三";
        this.age=18;
    }
    Person.prototype={
        constructor:Person,
        sleep:function (){
            return "睡觉"
        }
    };


    /*
     * 子类
     * */
    function Child(){
        this.age=20;
        //复制  不能拷贝到你的构造上面
    }
    Child.prototype={
        constructor:Child,
        eat:function (){
            return "吃饭";
        }
    };

    var c=new Child();
    console.log(c instanceof  Child);
    console.log(c instanceof  Person);

    console.log(c);

</script>
</body>
</html>

结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值