设计模式

设计模式
设计模式分为三种类型,共23种。
创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、
解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。

介绍几种常用的模式

工厂模式
意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
适用性
当一个类不知道它所必须创建的对象的类的时候。当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

function CreateMan(name,age) {
    var obj={};
    obj.name=name;
    obj.age=age;
    obj.sayName=function () {
        return this.name;
    };
    return obj;
}
var p1=CreateMan("zhangsan",20);
var p2=CreateMan("xie",30);

单例模式
单例模式的优点是:
可以用来划分命名空间,减少全局变量的数量。
使用单体模式可以使代码组织的更为一致,使代码容易阅读和维护。
可以被实例化,且实例化一次。

function Box() {
    this.name="";
}
Box.instance=null;
Box.getInstance=function () {
    if(!Box.instance){
        Box.instance=new Box();
    }
    return Box.instance;
};
var box1=Box.getInstance();
box1.name="zhang";
var box2=Box.getInstance();
box2.name="xie";
console.log(box1===box2);

构造器模式
构造器是一个当新建对象的内存被分配后,用来初始化该对象的一个特殊函数。
对象构造器是被用来创建特殊类型的对象的,首先它要准备使用的对象,其次在对象初次被创建时,
通过接收参数,构造器要用来对成员的属性和方法进行赋值。

function CreateMan(name,age) {
    this.name=name;
    this.age=age;
    this.toString=function () {
        return this.name+"年龄:"+this.age;
    }
}
var p1=new CreateMan("zhangsan",20);
var p2=new CreateMan("xie",30);
console.log(p1.toString());
console.log(p2.toString());

桥接模式
桥接模式就是将实现部分和抽象部分分离开来,以便两者可以独立的变化。
在实现api的时候,桥接模式非常常用。可以看到,forEach函数并不关心fn里面的具体实现.
fn里面的逻辑也不会被forEach函数的改写影响.

var forEach=function (arr,fn) {
    for(var i=0,l=arr.length;i<l;i++){
        var c=arr[i];
        if(fn.call(c,i,c)===false){
            return false;
        }
    }
};
function box1(index,num) {
    console.log(index,num);
}
var arr=[10,9,8,7,6,5,4];
forEach(arr,box1);

外观模式
外观模式是一种无处不在的模式,外观模式提供一个高层接口,
这个接口使得客户端或者子系统调用起来更加方法。比如:这样就方便组装,
如果一开始就把两个写到一个函数中,那就不能够只单独调用其中一个了。

function getName() {
        return "xietian";
    }
    function getSex() {
        return "man";
    }
    function getUserInfo() {
        var info=getName()+getSex();
        return info;
    }
    console.log(getUserInfo());

享元模式
享元模式是一个优化重复、缓慢和低效数据共享代码的经典结构化解决方案。
它的目标是以相关对象尽可能多的共享数据,来减少应用程序中内存的使用(例如:应用程序的配置、状态等)。
通俗的讲,享元模式就是用来减少程序所需的对象个数。

举一个例子,网页中的瀑布流,或者webqq的好友列表中,每次往下拉时,都会创建新的div。
那么如果有很多div呢?浏览器岂不是卡死了?所以我们会想到一种办法,
就是把已经消失在视线外的div都删除掉,这样页面就可以保持一定数量的节点,
但是频繁的删除和添加节点,又会带来很大的性能开销。这个时候就可以用到享元模式了,
享元模式可以提供一些共享的对象以便重复利用。比如页面中只能显示10个div,
那始终出现在用户视线中的这10个div就可以写成享元。
原理其实很简单, 把刚隐藏起来的div放到一个数组中, 当需要div的时候,
先从该数组中取, 如果数组中已经没有了, 再重新创建一个. 这个数组里的div就是享元,
它们每一个都可以当作任何用户信息的载体.

适配器模式

适配器模式就是将一个类的接口转换成客户希望的另外一个接口。通俗一点的说,
将像苹果手机不能差在电脑机箱上,必须有一个转换器,而这个转换器就是适配器。
在程序里适配器模式也经常用来适配2个接口, 比如你现在正在用一个自定义的js库.
里面有个根据id获取节点的方法 i d ( ) . 有 天 你 觉 得 j q u e r y 里 的 id(). 有天你觉得jquery里的 id().jquery实现得更酷,
但你又不想让你的工程师去学习新的库和语法. 那一个适配器就能让你完成这件事情.

代理模式

代理模式就是把对一个对象的访问,交给另一个代理对象来操作。说得通俗一点,
程序员每天写日报,日报最后会给总监审阅,但是如果所有人都直接发给总监,
那总监就没法工作了。所以每个人会把自己的日报发给自己的组长,再由组长转发给总监。这个组长就是代理。
编程中用到代理模式的情况也不少,比如大量操作dom时,我们会先创建文档碎片,再统一加到dom树中。

中介者模式
中介者模式是观察者模式中的共享被观察者对象。在这个系统中的对象之间直接的发布/订阅关系被牺牲掉了,
取而代之的是维护一个通信的中心节点。中介者模式和代理模式是有区别的,
中介者对象可以让各个对象之间不需要相互引用,从而使其耦合松散,
而且可以独立的改变透明之间的交互。通俗点讲,银行在存款人和贷款人之间也能看成一个中介。
存款人A并不关心他的钱最后被谁借走。贷款人B也不关心他借来的钱来自谁的存款。因为有中介的存在,
这场交易才变得如此方便。

观察者模式

观察者模式是这样一种设计模式。一个被称作被观察者的对象,维护一组被称为观察者的对象,
这些对象依赖于被观察者,被观察者自动将自身的状态的任何变化通知给它们。
当一个被观察者需要将一些变化通知给观察者的时候,它将采用广播的方式,
这条广播可能包含特定于这条通知的一些数据。当特定的观察者不再需要接受来自于它所注册的
被观察者的通知的时候,被观察者可以将其从所维护的组中删除。通俗点理解,就是面试官是被观察者,
而等待通知的人是观察者。
javascript中平时接触的dom事件,其实就是一种观察者模式的体现:
div.onclick = function click (){ alert (“click” ) }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值