美文网首页
js中的几种设计模式

js中的几种设计模式

作者: 梦的枷锁 | 来源:发表于2018-07-10 10:59 被阅读0次

设计者模式

1.特点

提高代码的重用性,可读性,使代码更容易的维护和扩展

2.原则

设计模式有六大原则:

  1. 开闭原则。就是说模块应对扩展开放,而对修改关闭。
  2. 里氏代换原则。如果调用的是父类的话,那么换成子类也完全可以运行。
  3. 依赖倒转原则。把父类都替换成它的子类,程序的行为没有变化。
  4. 接口隔离原则,每一个接口应该是一种角色,不多不少,不干不该干的事,该干的事都要干。
  5. 单一职责原则。
  6. 迪米特法则。 最少知识原则。

3.单例设计模式

定义:保证一个类仅有一个实例,并提供一个访问它全局的点

<!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();         //阻止表单提交默认行为
 if(!that.checkForm()) return;
 that.ajaxSubmit();
 }
 },
 checkForm : function () {
 return true;     //可使用正则表达式验证
 },
 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)是将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性),适配器模式使得原本由于接口不兼容而不能一起工作的那些类(对象)可以一些工作。俗称包装器(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">
 //适配器模式:在不修改旧的模式的前提下,来适应新的变化
 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.观察者模式

定义:观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。

<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<button id="btn1">发布信息</button>
<button id="btn2">删除订阅者</button>
<script>
 var publisher = {
 //注册订阅者信息
 register: function (event, subscriber) {    //event为publisher的一个属性
 //判断subscriber是否是函数
 if (typeof subscriber != "function")  return;
 //判断指定事件是否存在
 if (!this[event]) this[event] = [];
 this[event].push(subscriber);     //存储订阅者的信息函数
 },
 //向订阅者发送消息
 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);
 }
 }
 //向订阅者发布信息,订阅者使用函数充当
 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>

利用观察者模式定义三次点击事件

<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 = [];
 //设置鼠标点击的监听事件
 this.addEventListener("mousedown",function handleClick() {
 //点击事件间隔很长的时候
 if(this.times.length == 3){
 // [100, 200, 300]
 this.times.shift();
 }
 this.times.push(new Date().getTime());
 //当三次点击间隔很短的时候
 if(this.times.length == 3){
 if(this.times[2] - this.times[0]<500){
 this.times.length = 0;   //清空时间数组
 for (var tc of this.three){
 tc();           //调用函数,即f
 }
 }
 }
 })
 }
 btn1.addMyEventListener("three",function (){
 console.log("你点击了按钮一共三次");
 })
 btn2.addMyEventListener("three",function (){
 console.log("你点击了按钮二共三次");
 })
</script>
</body>
</html></pre>

</article>

相关文章

  • js中的几种设计模式

    设计者模式 1.特点 提高代码的重用性,可读性,使代码更容易的维护和扩展 2.原则 设计模式有六大原则:开闭原则。...

  • 前端设计模式

    JS设计模式一:工厂模式jS设计模式二:单例模式JS设计模式三:模块模式JS设计模式四:代理模式JS设计模式五:职...

  • 《JS设计模式》读书笔记(一)

    标签:JS 设计模式 《JS设计模式》读书笔记(二) 《JS设计模式》读书笔记(三) 《JS设计模式》读书笔记(四...

  • JS中的几种模式

    一、单例模式 把描述同一个事物(对象)的属性和方法放在同一个命名空间下防止相互之间的冲突,实现了分组,这种编写代码...

  • 《JS设计模式》读书笔记(六)

    标签:JS 设计模式 读书笔记链接: 《JS设计模式》读书笔记(一) 《JS设计模式》读书笔记(二) 《JS设计模...

  • 《JS设计模式》读书笔记(二)

    标签:JS 设计模式 读书笔记链接: 《JS设计模式》读书笔记(一) 《JS设计模式》读书笔记(三) 《JS设计模...

  • 《JS设计模式》读书笔记(三)

    标签:JS 设计模式 读书笔记链接: 《JS设计模式》读书笔记(一) 《JS设计模式》读书笔记(二) 《JS设计模...

  • 《JS设计模式》读书笔记(四)

    标签:JS 设计模式 读书笔记链接: 《JS设计模式》读书笔记(一) 《JS设计模式》读书笔记(二) 《JS设计模...

  • 《JS设计模式》读书笔记(五)

    标签:JS 设计模式 读书笔记链接: 《JS设计模式》读书笔记(一) 《JS设计模式》读书笔记(二) 《JS设计模...

  • 实习第七十四天(设计模式)

    参考 《JS设计模式》读书笔记(二) 《JS设计模式》读书笔记(三) 《JS设计模式》读书笔记(四) 《JS设计模...

网友评论

      本文标题:js中的几种设计模式

      本文链接:https://www.haomeiwen.com/subject/gblfpftx.html