javascript设计模式

面向对象编程

1.创建,使用函数

var CheckObject = {

checkName : function() {}

}

创建,使用类(原型,链式)

var CheckObject = function() {

this.checkName = fucntion(){}

}

var a = new CheckObject();

a.checkName();

var CheckObject = function(){};

CheckObject.prototype = {

checkName:function(){}

}

var a = new CheckObject();

a.checkName();

var CheckObject = function(){};

CheckObject.prototype = {

checkName:function(){

return this;

}

}

var a = new CheckObject();

a.checkName();

Function.prototype.addMethod = function(name,fn){

this[name] = fn;

}

var CheckObject = new Function();

CheckObject.addMethod('checkName',function(){});

CheckObject.checkName();

Function.prototype.addMethod = function(name,fn){

this[name] = fn;

return this;

}

var CheckObject = new Function();

CheckObject.addMethod('checkName',function(){});

CheckObject.checkName();

Function.prototype.addMethod = function(name,fn){

this[name] = fn;

return this;

}

var CheckObject = new Function();

CheckObject.addMethod('checkName',function(){

return this;

});

CheckObject.checkName();

Function.prototype.addMethod = function(name,fn){

this.ptototype[name] = fn;

return this;

}

var CheckObject = new Function();

CheckObject.addMethod('checkName',function(){

return this;

});

var a = new CheckObject();

a.checkName();

2.私有属性方法

公有属性方法(特权方法,构造器) this. 

类静态私有属性方法

类静态公有属性方法 prototype.

var Book = function(){

var name=1;//私有

this.getName = function(){};//公有,特权,构造器

}

Book.bookNum = 0;//静态私有

Book.prototype = {

isJSBook : false//静态公有

}


var Book = (function(){

var bookNum = 0; //静态私有

function _book(){

var name; //私有

this.getName = function(){}; //公有,特权,构造器

}

_book.prototype = {

isJSBook :false // 静态公有

}

return _book;

})();

继承

//类式继承

function SuperClass(){}

SuperClass.prototype.get = function(){};

function SubClass(){}

SubClass.prototype = new SuperClass();

SubClass.prototype.getSub = function(){};

var a = new SubClass();

a.get();

a.getSub();

//构造函数式继承

function SuperClass(){}

SuperClass.prototype.show(){};

function SubClass(){

SuperClass.call(this);

}

var a= new SubClass();

a.show();// 错误用法

//组合式继承

function SuperClass(){}

SuperClass.prototype,get=function(){};

function SubClass(){

SuperClass.call(this)

}

SubClass.protorype = new SuperClass();

SubClass.prototype.getSub = function(){};

var a = new SubClass();

a.get();

a.getSub();

//原型式继承

function inheritObject(o){

function F(){}

F.prototype = o;

return new F();

}

var book = {};

var newBook = inheritObject(book);

newBook.xxx;

//寄生式继承

function createBook(obj){

var o = new inheritObject(obj);

o.get = function(){};

return o;

}

var book = {};

var newBook = createBook(book);

newBook.xxx;


//寄生组合式继承

function inheritPrototype(subClass,superClass){

var p = inheritObject(superClass.prototype);

p.constructor = subClass;

subClass.prototype = p;

}

var SuperClass= {};

SuperClass.prototype.get= fucntion(){};

var SubClass(){

SuperClass.call(this);

};

inheritPrototype(SubClass,SuperClass);

SubClass.prototype.getSub = fucntion(){};

var a= new SubClass();

a.xxx;


创建型设计模式:处理对象创建

3.简单工厂模式

//先定义类,然后用函数返回一个类的实例对象

var PopFactory = function(name){

switch(name){

case 'alert':return newLoginAlert();

}

}

var userNameAlert=PopFactory ('alert');

//用函数返回一个对象

function createPop(type,text){

var o=new Object();

o.content = type;

o.show = function(){};

if(type === 'alert'){}

return o;

}

var userNameAlert = createPop('alert','xxx');

4.工厂方法模式

//在函数的属性里定义类,然后用函数返回一个类的实例对象

var Factory = function(type,content){

if(this instanceof Factory){

var s= new this[type](content);

return s;

}else{

return new Factory(type,content);

}

}

Factory.prototype={

Java:fucntion(){}

}

5.抽象工厂模式

//在函数的属性里定义抽象类,然后用函数返回一个抽象类的子类,然后用子类创建实例对象

var VeicleFactory = function(subType,superType){

if(typeof VehicleFactory[superType] === 'function'){

function F(){};

F.prototype = new VehicleFactory[superType]();

subType.constructor = subType;

subType.prototype = new F();

}else{

throw new Error('未创建该抽象类');

}

}

VhicleFactory.Car = function(){

this.type ='car';

}

VhicleFactory.Car.prototype = {

getPrice:function(){}

}

var BMW = function(price){

this.price =price;

}

VhicleFactory(BMW,'Car');

BMW.prototype.getPrice = function(){

return this.price;

}

var car = new BMW(1000);

car.getPrice();

car.type;

6.建造者模式

//用函数返回一个实例化对象,该实例化对象的某些属性是其他类的实例对象

var Human = fucntion(){};

Human.prototype={};

var Name = fucntion(name){};

var Work = function(work){};

Work.prototype=fucntion(){};

var Person = function(name,work){

var _person = new Human();

_person.name = new Name(name);

_person.work =new  Work(work);

return _person;

}

var person = new Person('xxx','xxx');

7.原型模式

//先创建父类,再创建子类,最后通过子类创建实例对象

var LoopImages=function(){};

LoopImages.prototype={};

var FadeLoopImg = function(){

LoopImages.call(this);
}

FadeLoopImg.prototype = new LoopImages();

var fadeImg = new FadeLoopImg();

//原型继承,创建一个对象,该对象的原型复制其他属性

var prototypeExtend(){

var F = function(),args=arguments,i=0,len=args.length;

for(;i<len;i++){

for(var j in args[i]){

F.prototype[j]=args[i][j];

}

}

return new F();

}

var penguin = prototypeExtend({xxx});

penguin.xxx;

8.单例模式

//用对象收编函数,此对象相当于命名空间

//单例模式还可以用来创建小型代码库,静态变量,惰性单例

var Ming = {

g:function(){}

}


结构型设计模式:如何将类或对象组合成更大更复杂的结构

9.外观模式

//兼容处理

function addEvent(dom,type,fn){

if(dom.addEventListener){

dom.addEventListener(type,fn,false);

}else if(dom.attachEvent){

dom.attachEvent('on'+type,fn);

}else{

dom['on'+type]=fn;

}

}

addEvent(xxx,'click',function(){});

10.适配器模式

//把旧框架的方法用新框架重写

A.g=function(id){

return $(id).get(0);

}

//适配多个参数

function doSomeThing(obj){

var _adapter = {

name:'xxx'

}

for(var i in _adapter){

_adapter[i] = obj[i] || _adapter[i];

}

}

//数据适配

var arr = ['js','book','前端','8月1日'];

function arrToObjAdapter(arr){

return{

name:arr[0],

type:arr[1],

title:arr[2],

data:arr[3]

}

}

var arrToObjAdapter(arr);

//服务器端数据适配

function ajaxAdapter(data){

return [data[key1],data[key2]]

}

11.代理模式

//统计代理

car Count = (fucntion(){

var _img = new Image();

return function(param){

var str = 'http://www.count.com/a.gif?';

for(var i in param){

str+=i+'='+param[i];

}

_img.src = src

}

})()

Count({num:10})

//jsonp

<script type="text/JavaScript">

function jsonpCallBack(res,rep){}

</script>

<script type="text/JavaScript" src="http://localhost/test/jsonp.php?callback=jsonpCallBack&data=getJsonData">

<?php

$data = $_GET['data'];

$callback = $GET['callback'];

echo $callback."('success','".$data."')";

?>

12.装饰者模式

var decorator = function(input,fn){

var input = document.getElementById(input);

if(typeof input.onclick === 'function'){

var oldClickFn = input.onclick;

input.onclick = function(){

olc=dClickFn;

fn();

}

}else{

input.onclick = fn;

}

}

13.桥接模式

//分离事件与UI

fucntion changeColor(dom,color){

dom.style.color = color;

}

var spans = document.getElementByTagName('span');

spans[0].onMouseover = function(){

changeColor(this,'red');

}

14.组合模式

//抽象类

var News = function(){

this.children = [];

this.element = null;

}

New.prototype = {

init:function(){

throw new Error(‘请重写你的方法’);

}

}

//类簇1

var Container = function(id,parent){

New.call(this);

this.id = id;

this.init();

}

inhertPrototype(Container,News);

Container.prototype.init = function(){}

//类簇2

var ImageNews= function(clasname){

New.call(this);

this.init();

}

inhertPrototype(ImageNews,News);

ImageNews.prototype.init=function(){}

//实例对象

var news1 = new Container('news');

news1.add(

new Item('normal').add(

new ImageNews('xxx')

)

)

15.享元模式

//翻页时改变dom内容

var FlyWeight = function(){

var created = [];

function(){

var dom = document.createElement('div');

document.getElementById('container').appendChild(dom);

created.push(dom);

return dom;

}

return{

getDiv:function(){

if(created.length <5){

return create();

}else{

var div = created.shift();

created.push(div);

return div;

}

}

}

}


行为型设计模式:不同对象之间职责划分或算法抽象

16.模板方法模式

//父类

var Alert = function(){}

Alert.prototype={}

//子类

var RightAlert = function(){

Alert.call(this);

}

RightAlert.prototype = new Alert();

new RightAlert().init();

17.观察者模式

var Observer = (function(){

var _message={};

return {

regist:function(type,fn){

if(typeof _messages[type] === 'undefined'){

_messages[type] = [fn];

}else{

_messages[type].push(

}

},

fire:function(){

if(!_messages[type])

return;

var events = {

type:type,

args:args||{}

},

i=0,

len = _messages[type].length;

for(;i<len;i++){

_messages[type][i].call(this,events);

}

},

remove:function(){

if(_meassages[type] instanceof Array){

var i = _messages[type].length -1;

for(;i>=0;i--){

_messages[type][i] ===fn && _messsages[type].splice(i,1);

}

}

}

}

})();


var Student = function(result){

var that = this;

that.say = function(){}

};

Student.prototype.answer = function(question){

Observer.register(question,this,say);

}

Student.prototype.sleep = function(){

Observer.remove(question,this.say);

}

var Teacher = function(){};

Teacher.prototype.ask=function(){

Obeserve.fire(question);

}

var student1 = new Student(),student1 = new Student(),student1 = new Student();

student1.answer('问题1');

student1.answer('问题2');

student2.answer('问题1');

student3.answer('问题1');

student3.answer('问题2');

student1.sleep('问题2');

var teacher = new Teacher();

teacher.ask('问题1');

teacher.ask('问题2');

18.状态模式

var ResultState = function(){

var States = {

state0:function(){}

}

function show(result){

States['state'+result]&&State['state'+result]();

}

return {

show:show

}

}

19.策略模式

var PriceStrategy = function(){

var stragtery = {

return30:function(price){}

}

return function(algorithm,price){

return stragtegy[algorithm]&&stragtegy[algorithm](price);

}

}();

var price=PriceStrategy('return30','312');

20.职责链模式

请求模块,响应数据适配模块,创建组件模块单元测试

21.命令模式

var viewCommand = (function(){

//模板类型

var tpl={

product:[

'<p>{#text#}</p>'

].join(''),

title:[].join()

},

html = '';

function formateString(str,obj){

return str.replace(/\{#(\w+)#\}/g),function(match,key){

return obj[key];

})

}

var Action = {

create:function(data,view){

if(data.length){

for(var i =0,len=data.length;i<len;i++){

html+=formateString(tpl[view],data[i]);

}else{

html+=formatString(tpl[view],data);

}

}

},

display:function(container,data,view){

if(data){

this.create(data,view);

}

document.getElementById(container).innerHTML = html;

html='';

}

}

return function excute(){

msg.param = Object.prototype.toString.call(msg.param) === "[objectArray]"?msg.param:[msg.param];

Action[msg.command].apply(Action,msg.param);

}

})();

viewCommand({command:'display',param:{'title',titleData,'title'}});


22.访问者模式

function bindIEEvent(dom,type,fn,data){

var data =data||{};

dom.attachEvent('on'+type,function(e){

fn.call(dom,e,data);

})

}

23.中介者模式

var mediator = function(){

var _msg = {};

return {

register:function(type,action){

if(!_msg[type]){

_msg[type] = {};

}

_msg[type].push(action);

},

send:function(){

if(_msg[type]){

for(var i=0,len=_msg[type].length;i<len;i++){

_msg[type][i]&&_msg[type][i]();

}

}

}

}

}();

24.备忘录模式

var  Page = function(){

var cache ={};

return function(page,fn){

if(!cache[page]){

$.post('xxx',{page:page},function(res){

if(res.errNo == 0){

cache[page] = res.data;

}

showPage(page,res.data);

fn&&fn();

})

}

}

}

25.迭代器模式

var Iterator = function(items,container){

var container = container && document.getElementsByTagName(container) || document;

items = container.getElementsByTagName(items),

length = items.length,

index = 0,

splice = [].splice;

return{

first:function(){

index = 0;

rerurn items[index];

},

second:fucntion(){

index = items.length -1;

rerurn items[index];

},

pre:fucntion(){

if(--index >0){

return items[index]

}else{

index = 0;

rerurn null;

}

},

next:function(){

if(++index > length){

return items[index];

}else{

index = length -1;

return null;

}

},

get:function(num){

index = num >=0?num%length:num%length +length;

rerurn items[index];

},

dealEach:function(fn){

var args = splice.call(arguments,1);

for(var i=0;i<lengthl;i++){

fn.apply(items[i],args);

}

},

dealItem:fucntion(num,fn){

fn.apply(this.get(num),splice.call(arguments,2));

},

exclusive:function(num,allFn,numFn){

this.dealEach(allFn);

if(Object.prototype.toString.call(num) === "[Object Array]"){

for(var i=0,len = num.length;i<len;i++){

this.getItem(num[i],numFn);

}

}else{

this.getItem(num[i],numFn);

}

}

}

}

//数组迭代器,对象迭代器

//同步变量迭代取值器

var AGetter = function(key){

if(!A){

return undefined;

}

var result = A;

key = key.split(.);

for(var i = 0;,len=key.length;i<len;i++){

if(result[key[i]] !== undefined){

result = result[key[i]]

}else{

return undefined;

}

}

return result;

}

//同步变量迭代赋值器

var Asetter = function(key,val){

if(!A)

return false;

var result = A;

key = key.split('.');

for(var i =0,len=key.length;i<len-1;i++){

if(result[key[i]] === undefined){

result[key[i]] = {};

}

if(!(resultp[key[i]] instanceof Object)){

throw new Error('A.'+key.splice(0,i+1).join('.')+'is not Object');

return false;

}

return result[key[i]];

}

return result[key[i]]= val;

}

// 分支循环嵌套问题

function dealImage(){

var Deal = function(){

var method = {

'red':function(){}

}

return function(type){

return method[type];

}();

function eachData(fn){

for(var i=0,len=data.length;i<len;i+=4){

fn(i);

}

}

}

}

26.解释器模式

算法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容