面向对象进阶篇之中介者模式

来源:互联网 发布:中国亚投行失败了知乎 编辑:程序博客网 时间:2024/06/04 19:22

  一 、智商的两个定义 

百度百科的定义:

智力商数(Intelligence Quotient),简称智商(英语:IQ),是通过一系列标准测试测量人在其年龄段的认知能力(“智力”)的得分。由法国的比奈(Alfred Binet,1857年-1911年)和他的学生所发明,他根据这套测验的结果,将一般人的平均智商定为100,而正常人的智商,根据这套测验,大多在85到115之间。智力是遗传基因控制的,人为无法改变

资深投资人李笑来的定义:

  脑子里有多少个清晰、准确、必要的概念;

  那些清晰、准确、必要的概念之间有多少清晰、必要、准确的关联(举例)

  智商从来不全是天赋,努力至少有机会

总结:

当一个真相并没有浮出水面的时候,你所认为的真相不过是你的选择,推荐选择一种对你有指导意义的,可帮助你做自我提升的说法。

二、大方向和细节

     我认为任何一门技术的存在都来源于解决实际的问题,然而要想流行起来被大家普遍的应用,至少具备以下特性:

   一、适用性强

             为了实现适用性必定要把千千万万个具体的问题抽象成一个概念或一种模式或者更通俗一点叫一种套路,我愿意把它看成是大方向

        、具体可操作性

            碰到各种各样具体问题的时候,可以从中找到入口,就是我们所说的API,我愿意把他看成是细节。

            大方向指引这细节,细节佐证大方向(举例)

三、面向对象是什么

面向过程:

是分析出解析问题所要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个一调用。

面向对象:

是把构成问题事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。

  老话说的好,凡是都有个过程,所以不要妄想用了面向对象就想摆脱面向过程,通过对这两个概念的比较,他们之间的联系是:面向对象就是简化,形象化了的面向过程。

  

四、中介者模式

其实在面向对象的语言环境下,你写的每一句代码都是在应用面向对象的思维,为什么呢?你写代码无非是做下面这些事情:

   1,创建对象,为对象添加属性和方法。

   2,建立对象与对象之间的联系

   3,利用对象实现过程。

     是不是每句话都没逃离对象。

     试想一下如果应用比较复杂,势必会有很多的对象,很多的联系,进而导致牵连太多不好维护,因此前辈们建议我们专门用一个对象来管理这些个联系,这个对象就是所谓的中介者,这种解决问题的套路,我们称之为中介者模式,事实上中介者模式应用到了我们生活中的方方面面,小到一场比赛要个裁判,大到我现在常常说的p2p。


五、面向对象+中介这模式

  下面我们来写一个应用(比谁手快)

  我们先来描述一下过程吧:

   裁判发出指令,游戏开始,玩家使劲按键,计分板同步计分,10秒钟后游戏结束,抛出胜者。

   请移步代码部分,谢谢!


(function(global){
"use strict"
//模块顶部申明依赖,定义变量此处没有依赖
var Player, player1, player2, player3, mediator, showGoals,
part1 = document.getElementById('play1') ,
    part2 = document.getElementById('play2') ,
    part3 = document.getElementById('play3') ,
    victor = document.getElementById('victor'),
    start = document.getElementById('start');


/*创建对象,建立联系阶段开始*/


//创建玩家
function Player(id){
this.id = id;
};
Player.prototype = {
constructor: Player,
play: function(){
mediator.count(this.id);
}
};


player1 = new Player(0);
player2 = new Player(1);
player3 = new Player(2);


    //创建中介者
    mediator = {
    goals:[0,0,0],
    //积分
    count:function(id){
    this.goals[id]++;
    showGoals.show(this.goals);
    },
    //开始游戏,定时结束
    start:function(){
    if(!confirm('是否开始游戏')) return ;
    var goals = this.goals ;
    document.onkeyup = function(e){
    e = e || window.event;
    var code = parseInt(e.keyCode,10);
    switch(code){
                    case 49 :
                    player1.play();
                    break ;
                    case 75 :
                    player2.play();
                    break ;
                    case 96 :
                    player3.play();
                    break ;
    }
    };
    setTimeout(function(){
    document.onkeyup = null;
    alert('游戏结束');
    showGoals.showVictor(goals);
    },10000);
    },
    };


    //创建积分板
    var showGoals = {
    show:function(goals){
    part1.innerHTML = goals[0];
    part2.innerHTML = goals[1];
    part3.innerHTML = goals[2];
    },
    showVictor:function(goals){
    var victorIds = [2] , str = '赢家是:' ;
            //找最大
    for(var i=3 ; i--; ){
    if(i<1) continue ;
    if(goals[i-1] > goals[i]){
    victorIds[0] = i-1;
    };
    }; 


            //找并列最大
            for(var i=3 ; i--; ){
                var index = victorIds[0];
                if(index == i) continue;
                if(goals[i] == goals[index]){
                    victorIds.push(i);
                }
            };


            //拼字符串
            for(var i=victorIds.length ; i--; ){
                str = str + ' 玩家' + (victorIds[i]+1);
            };


    victor.innerHTML = str ;
    }


    };


    /*面向过程阶段开始*/
    start.onclick = function(){
    mediator.goals = [0,0,0];
    showGoals.show(mediator.goals);
    victor.innerHTML = ''; 
    mediator.start();
    };


})(this);



原创粉丝点击