[关闭]
@GivenCui 2016-06-01T14:44:36.000000Z 字数 4234 阅读 657

第七,八课 设计模式

js高级



目录



JS课程合集跳转链接


设计模式的概念

什么是设计模式

  • 设计模式是一套反复使用, 代码设计经验的总结.使用设计模式是为了能够更好的理解代码,更好的重用代码.
  • 设计模式不是JS独有的, 我们常用的23种设计模式, 针对的是大部分面向对象语言.

1.代理设计模式

想实现某个功能,自己不去实现,我委托"别人"帮我实现.

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <script type = "text/javascript">
  7. </script>
  8. </head>
  9. <body>
  10. </body>
  11. </html>

2.单例设计模式

单例设计模式
通过构造函数,无论创造多少次,只能创造出来唯一的一个实例对象.
单例设计模式的应用场景:
1. 节约性能
2. 数据共享
3. window就是单例对象

单线程就可以用this第二次以后保持不变;JS就是单线程的.
多线程的话可能没办法确定谁是第一次,上"锁"解决.

单例设计模式的实现思想

查资料!
!!!!!!!!!!

匿名函数立即调用的写法

声明和调用一起写的方法
应用作为匿名空间
应用在闭包情况下的立即调用
在单例模式时用来第一次创建之后就"锁住"

  1. (function () {
  2. console.log("测试,是否立即调用??");
  3. })();
  1. var fn = (function () {
  2. console.log("另一种写法");
  3. })();

3.策略设计模式

定义一些算法或逻辑, 把它们封装起来, 根据情况去分别调用这些算法和逻辑;

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>策略设计模式</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 创建一个策略对象, 方便管理相应的算法
  10. // 类似switch的逻辑,可以代替switch来设计更高级的功能!!
  11. var strategies = {
  12. a : function (salary) { // a策略
  13. return salary*2;
  14. },
  15. b : function (salary) { // b策略
  16. return salary*3;
  17. },
  18. c : function (salary) { // c策略
  19. return salary*4;
  20. }
  21. };
  22. //
  23. var getMoney = function (level,salary) {
  24. // 用[]去匹配
  25. return strategies[level](salary); // []可以调用形参属性,同时属性又是一个方法
  26. };
  27. var x = getMoney("b", 20000);
  28. console.log(x);
  29. </script>
  30. </body>
  31. </html>

4.适配器设计模式

解决两个软件或者两个程序数据接口不兼容的问题
举例: 生活中的笔记本的电源适配器

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>适配器设计模式</title>
  6. <script type = "text/javascript">
  7. </script>
  8. </head>
  9. <body>
  10. </body>
  11. </html>

5.工厂设计模式

设计一个函数,用来接收参数,并根据不同的参数返回同一个接口的不同实例.

工厂设计模式的优缺点:
1. 优点: 解决了创建多个相似对象的问题
2. 缺点: 没有解决对对象的识别问题(没有明确的对象的类型).

思想的应用
1. 把工厂作为一个工具类去封装方法.

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>工厂设计模式</title>
  6. <script type = "text/javascript">
  7. </script>
  8. </head>
  9. <body>
  10. </body>
  11. </html>

6.模板设计模式

利用继承的思想实现模板设计模式,JS中的继承是利用prototype来实现.

两部分组成
1.抽离出来的父类(父级)对象
2.具体的子类(子级)对象


注: JS中没有类的继承,只有对象的继承.换句话说,某个类型只能继承于某个类型的一个实例对象.

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>模板设计模式</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 模板设计模式,利用继承
  10. // JS的继承用prototype来实现
  11. /*
  12. * 咖啡
  13. * 1. 烧水
  14. * 2. 冲咖啡
  15. * 3. 把咖啡倒入杯子
  16. * 4. 加糖和奶
  17. *
  18. */
  19. // coffee构造函数
  20. // console.group("喝咖啡流程");
  21. // var Coffee = function () {
  22. // };
  23. // // 烧水方法
  24. // Coffee.prototype.boilWater = function () {
  25. // console.log ("烧水");
  26. // };
  27. // // 冲咖啡
  28. // Coffee.prototype.brewCoffee = function () {
  29. // console.log("冲咖啡");
  30. // };
  31. // // 把咖啡倒入杯子
  32. // Coffee.prototype.pourInCup = function () {
  33. // console.log("把咖啡倒入杯子");
  34. // };
  35. // // 加糖/盐
  36. // Coffee.prototype.addSugarAndMilk = function () {
  37. // console.log("加糖和奶");
  38. // };
  39. // /*********封装一下咖啡的流程**********/
  40. // Coffee.prototype.init = function () {
  41. // this.boilWater();
  42. // this.brewCoffee();
  43. // this.pourInCup();
  44. // this.addSugarAndMilk();
  45. // };
  46. // // 创建一个咖啡对象
  47. // var coffee = new Coffee();
  48. // coffee.init();
  49. // console.groupEnd();
  50. // console.group("喝茶流程");
  51. // /*
  52. // * 茶
  53. // */
  54. // // 喝茶的构造函数
  55. // var Tea = function () {
  56. // };
  57. // // 1.烧水
  58. // Tea.prototype.boilWater = function () {
  59. // console.log("烧水");
  60. // };
  61. // // 2.沏茶
  62. // Tea.prototype.brewTea = function () {
  63. // console.log("沏茶");
  64. // };
  65. // // 3.把茶放到杯子中
  66. // Tea.prototype.pourInCup = function () {
  67. // console.log("把茶放到杯子中");
  68. // };
  69. // // 4.加柠檬
  70. // Tea.prototype.addLemon = function () {
  71. // console.log("加柠檬");
  72. // };
  73. // // 封装喝茶流程
  74. // Tea.prototype.init = function () {
  75. // this.boilWater();
  76. // this.brewTea();
  77. // this.pourInCup();
  78. // this.addLemon();
  79. // };
  80. // // 创造茶的实例
  81. // var tea = new Tea();
  82. // tea.init();
  83. // console.groupEnd();
  84. /******发现有共同点,提出一个父类*****/
  85. console.group("用模板设计模式优化");
  86. // 共同的部分抽象到一个父类里,子类继承父类即可
  87. // JS中没有类的继承,只有对象的继承.换句话说,某个类型只能继承于某个类型的一个实例对象.
  88. // 咖啡和茶共有方法抽象
  89. // 1.boilwater() 2. brew() 3. pourInCup() 4. add()
  90. // 放到父类里
  91. var Drink = function () {
  92. };
  93. Drink.prototype.boilwater = function () {
  94. console.log("烧水");
  95. };
  96. // 空是为了子类去具体实现
  97. Drink.prototype.brew = function () {
  98. };
  99. Drink.prototype.pourInCup = function () {
  100. console.log("倒入杯中");
  101. };
  102. // 空是为了子类去具体实现
  103. Drink.prototype.add = function () {
  104. };
  105. // 父类流程的实现
  106. Drink.prototype.init = function () {
  107. this.boilwater();
  108. this.brew();
  109. this.pourInCup();
  110. this.add();
  111. };
  112. /********下面是子类**************/
  113. console.log("*****喝茶*****");
  114. // 咖啡
  115. var Coffee = function () {
  116. };
  117. Coffee.prototype = new Drink();
  118. Coffee.prototype.constructor = Coffee;
  119. Coffee.prototype.brew = function() {
  120. console.log("冲咖啡");
  121. };
  122. Coffee.prototype.add = function() {
  123. console.log("咖啡中加糖");
  124. };
  125. var coffee = new Coffee();
  126. coffee.init();
  127. console.log("*****喝茶*****");
  128. // 茶
  129. var Tea = function () {
  130. };
  131. Tea.prototype = new Drink();
  132. Tea.prototype.constructor = Tea;
  133. Tea.prototype.brew = function() {
  134. console.log("冲茶");
  135. };
  136. Tea.prototype.add = function() {
  137. console.log("茶中加柠檬");
  138. };
  139. var tea = new Tea();
  140. tea.init();
  141. console.groupEnd();
  142. </script>
  143. </body>
  144. </html>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注