js中的幾種設(shè)計(jì)模式

設(shè)計(jì)者模式

1.特點(diǎn)

提高代碼的重用性,可讀性,使代碼更容易的維護(hù)和擴(kuò)展

2.原則

設(shè)計(jì)模式有六大原則:

  1. 開(kāi)閉原則晒骇。就是說(shuō)模塊應(yīng)對(duì)擴(kuò)展開(kāi)放,而對(duì)修改關(guān)閉磺浙。
  2. 里氏代換原則洪囤。如果調(diào)用的是父類的話,那么換成子類也完全可以運(yùn)行撕氧。
  3. 依賴倒轉(zhuǎn)原則瘤缩。把父類都替換成它的子類,程序的行為沒(méi)有變化呵曹。
  4. 接口隔離原則款咖,每一個(gè)接口應(yīng)該是一種角色,不多不少奄喂,不干不該干的事,該干的事都要干海洼。
  5. 單一職責(zé)原則跨新。
  6. 迪米特法則。 最少知識(shí)原則坏逢。

3.單例設(shè)計(jì)模式

定義:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它全局的點(diǎn)

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <script src="../my_ajax.js"></script>
</head>
<body>
<form action="">
 <input type="text" name="user">
 <input type="password" name="pwd">
 <input type="submit" value="登錄">
</form>
<script type="text/javascript">
 var submitObj = {
 form : document.forms[0],
 submitUrl : "data2.php",
 _init : function () {
 this.handSubmit();
 },
 handSubmit : function () {
 var that = this;
 this.form.onsubmit = function (e) {
 e.preventDefault();         //阻止表單提交默認(rèn)行為
 if(!that.checkForm()) return;
 that.ajaxSubmit();
 }
 },
 checkForm : function () {
 return true;     //可使用正則表達(dá)式驗(yàn)證
 },
 ajaxSubmit : function () {
 my_ajax.post(this.submitUrl,new FormData(this.form),this.submitResult)
 },
 submitResult : function (result) {
 console.log(result);
 }
 }
 submitObj._init();
</script>
</body>
</html></pre>

4.適配器模式

定義:適配器模式(Adapter)是將一個(gè)類(對(duì)象)的接口(方法或?qū)傩裕┺D(zhuǎn)化成客戶希望的另外一個(gè)接口(方法或?qū)傩裕┯蛘剩m配器模式使得原本由于接口不兼容而不能一起工作的那些類(對(duì)象)可以一些工作赘被。俗稱包裝器(wrapper)。

<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <script src="../my_ajax.js"></script>
</head>
<body>
<p id="p1"></p>
<p id="p2"></p>
?
<script type="text/javascript">
 //適配器模式:在不修改舊的模式的前提下,來(lái)適應(yīng)新的變化
 my_ajax.get("data3.json",function (result) {
 showMsg(JSON.parse(result),p1);
 })
 my_ajax.get("data4.json",function (result) {
 showMsgAdapter(JSON.parse(result),p2);
 })
 function showMsg(obj,p) {
 p.innerHTML = obj.name;
 }
 function showMsgAdapter(arr,p) {
 showMsg(arr[0],p2);
 }
</script>
</body>
</html></pre>

5.觀察者模式

定義:觀察者模式又叫發(fā)布訂閱模式(Publish/Subscribe)肖揣,它定義了一種一對(duì)多的關(guān)系民假,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象,這個(gè)主題對(duì)象的狀態(tài)發(fā)生變化時(shí)就會(huì)通知所有的觀察者對(duì)象龙优,使得它們能夠自動(dòng)更新自己羊异。

<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<button id="btn1">發(fā)布信息</button>
<button id="btn2">刪除訂閱者</button>
<script>
 var publisher = {
 //注冊(cè)訂閱者信息
 register: function (event, subscriber) {    //event為publisher的一個(gè)屬性
 //判斷subscriber是否是函數(shù)
 if (typeof subscriber != "function")  return;
 //判斷指定事件是否存在
 if (!this[event]) this[event] = [];
 this[event].push(subscriber);     //存儲(chǔ)訂閱者的信息函數(shù)
 },
 //向訂閱者發(fā)送消息
 publish: function (event, msg) {
 if (!this[event])  return;   //判斷指定事件是否存在
 for (var sub of this[event]) {
 sub(msg);
 }
 },
 //刪除訂閱者
 remove: function (event, sub) {
 if (!this[event] || this[event].indexOf(sub) == -1)   return;
 this[event].splice(this[event].indexOf(sub), 1);
 }
 }
 //向訂閱者發(fā)布信息,訂閱者使用函數(shù)充當(dāng)
 var f = function (msg) {
 console.log("第一條消息是" + msg);
 }
 publisher.register("500", f);
 publisher.register("600", function (msg) {
 console.log("第二條消息是" + msg);
 })
 publisher.register("500", function (msg) {
 console.log("第三條消息是" + msg);
 })
 publisher.register("700", function (msg) {
 console.log("第四條消息是" + msg);
 })
 btn1.onclick = function () {
 publisher.publish("500", "最新消息500");
//        publisher.publish("700","最新消息700");
 }
 btn2.onclick = function () {
 publisher.remove("500", f);
 }
</script>
</body>
</html></pre>

利用觀察者模式定義三次點(diǎn)擊事件

<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<button id="btn1">按鈕一</button>
<button id="btn2">按鈕二</button>
<script type="text/javascript">
 //給button的原型添加方法
 HTMLButtonElement.prototype.addMyEventListener = function (event,f) {
 if(!this[event])   this[event] = [];
 this[event].push(f);
 this.times = [];
 //設(shè)置鼠標(biāo)點(diǎn)擊的監(jiān)聽(tīng)事件
 this.addEventListener("mousedown",function handleClick() {
 //點(diǎn)擊事件間隔很長(zhǎng)的時(shí)候
 if(this.times.length == 3){
 // [100, 200, 300]
 this.times.shift();
 }
 this.times.push(new Date().getTime());
 //當(dāng)三次點(diǎn)擊間隔很短的時(shí)候
 if(this.times.length == 3){
 if(this.times[2] - this.times[0]<500){
 this.times.length = 0;   //清空時(shí)間數(shù)組
 for (var tc of this.three){
 tc();           //調(diào)用函數(shù),即f
 }
 }
 }
 })
 }
 btn1.addMyEventListener("three",function (){
 console.log("你點(diǎn)擊了按鈕一共三次");
 })
 btn2.addMyEventListener("three",function (){
 console.log("你點(diǎn)擊了按鈕二共三次");
 })
</script>
</body>
</html></pre>

</article>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市彤断,隨后出現(xiàn)的幾起案子野舶,更是在濱河造成了極大的恐慌,老刑警劉巖宰衙,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件平道,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡供炼,警方通過(guò)查閱死者的電腦和手機(jī)一屋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袋哼,“玉大人陆淀,你說(shuō)我怎么就攤上這事∠孺遥” “怎么了轧苫?”我有些...
    開(kāi)封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)疫蔓。 經(jīng)常有香客問(wèn)我含懊,道長(zhǎng),這世上最難降的妖魔是什么衅胀? 我笑而不...
    開(kāi)封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任岔乔,我火速辦了婚禮,結(jié)果婚禮上滚躯,老公的妹妹穿的比我還像新娘雏门。我一直安慰自己,他們只是感情好掸掏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布茁影。 她就那樣靜靜地躺著,像睡著了一般丧凤。 火紅的嫁衣襯著肌膚如雪募闲。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天愿待,我揣著相機(jī)與錄音浩螺,去河邊找鬼靴患。 笑死,一個(gè)胖子當(dāng)著我的面吹牛要出,可吹牛的內(nèi)容都是我干的鸳君。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼患蹂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼或颊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起况脆,我...
    開(kāi)封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饭宾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后格了,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體看铆,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年盛末,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弹惦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悄但,死狀恐怖棠隐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情檐嚣,我是刑警寧澤助泽,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站嚎京,受9級(jí)特大地震影響嗡贺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鞍帝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一诫睬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帕涌,春花似錦摄凡、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至辟躏,卻和暖如春谷扣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捎琐。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工会涎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瑞凑。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓末秃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親籽御。 傳聞我的和親對(duì)象是個(gè)殘疾皇子练慕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用技掏、多...
    MinoyJet閱讀 3,906評(píng)論 1 15
  • 參考資料:菜鳥教程之設(shè)計(jì)模式 設(shè)計(jì)模式概述 設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐铃将,通常被有經(jīng)驗(yàn)...
    Steven1997閱讀 1,167評(píng)論 1 12
  • 創(chuàng)建型模式 工廠模式 工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)...
    隔墻送來(lái)秋千影閱讀 2,649評(píng)論 0 11
  • 生活有白天也有黑夜,一年中也許只有一天白天和黑夜才一樣長(zhǎng)鸠真。沒(méi)有糾結(jié)悯仙,沒(méi)有區(qū)分,都是被安排的假裝完美吠卷。 心锡垄,它可能只...
    這里只有我閱讀 112評(píng)論 0 0
  • 生活需要儀式感,儀式的一個(gè)重要功能祭隔,就是特意構(gòu)造出一種活動(dòng)作為標(biāo)記货岭,把原本川流不息而又平平淡淡的生活劃分成一個(gè)個(gè)階...
    成武cw閱讀 267評(píng)論 0 2