前言

模式是在某一背景下某个问题的一种解决方案。

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

为了保证代码的可靠性、提高代码的复用率、使代码更容易被维护和阅读,我们需要了解并合理使用设计模式。

日常开发中,一些特定的场景下你的处理方法可能并不是很理想,往往这时借助一些设计模式可以让你优雅而高效的实现这些逻辑,下面就介绍一些虽然不是最全的但一定是最常用的设计模式。

单例模式:

**定义:**一个类只返回一个实例,一旦创建再次调用就直接返回。

**使用场景:**比如自定义弹窗,无论你程序中多少调用,都只应创建一个弹窗对象。

class CreateUser {constructor(name) {this.name = name;this.getName();}getName() {return this.name;}
};const ProxyMode = (() => {let instance = null;return (name) => {if(!instance) {instance = new CreateUser(name);}return instance;}
})();let a = ProxyMode('vn');
let b = ProxyMode('lb');console.log(a, b);   // vn  vn    单例模式只会创建一次实例

策略模式:

**定义:**定义一个策略类只专注与各方法算法实现,定义一个接口调用这些方法。

特点:代码优雅,可读性高。

// 策略类
const levelObj = {"A": money => money * 4,"B": money => money * 3,"C": money => money * 2
}// 环境类  封装调用接口
const getMoney = (level, money) => levelObj[level](money);console.log(getMoney('A', 200))   // 800

代理模式:

**定义:**为一个对象提供一个代用品或占位符,以便控制对它的访问。

**使用场景:**比如图片懒加载,先缓存动态 loading,必要时传入 src。

const imgFunc = (() => {let imgNode = document.createElement('img');document.body.appendChild(imgNode);return {setSrc: (src) => {imgNode.src = src;}}
})();const ProxyImg = (() => {let img = new Image();img.onload = () => {let node = document.getElementsByTagName('img')imgFunc.setSrc(img.src);}return {setSrc: (src) => {imgFunc.setSrc('../C3photo/jacky/1.jpg');img.src = src;}}
})();ProxyImg.setSrc('../C3photo/jacky/2.jpg');

装饰者模式:

**定义:**装饰者模式能够在不改变对象自身的基础上,在运行程序期间给对象动态地添加职责。

**使用场景:**类似于拦截器,添加对象的前置和后置事件等。

Function.prototype.before = function(beforefn) {let _self = this;                          return function () {beforefn.apply(this, arguments);return _self.apply(this, arguments);}
}
Function.prototype.after = function(afterfn) {let _self = this;return function(){let ret = _self.apply(this, arguments);afterfn.apply(this, arguments);return ret;}
}
let func = function() {console.log('2');
}
//func1和func3为挂载函数
let func1 = function() {console.log('1');
}
let func3 = function() {console.log('3');
}func = func.before(func1).after(func3);
func();   // 1  2  3

发布订阅模式:

**定义:**订阅者(Subscriber)把自己想订阅的事件注册(Subscribe)到调度中心(Event Channel),当发布者(Publisher)发布该事件(Publish Event)到调度中心,也就是该事件触发时,由调度中心统一调度(Fire Event)订阅者注册到调度中心的处理代码。

**使用场景:**微信公众号的订阅

let eventEmitter = {list: {}, on(event, fn) {// 订阅let _this = this;_this.list[event] = _this.list[event] || [];_this.list[event].push(fn);return _this;},emit() {// 发布let _this = this;let event = [].shift.call(arguments),fns = _this.list[event];if (fns && fns.length) {fns.forEach((fn) => fn.apply(_this, arguments));}return _this;},off(event, fn) {// 取消订阅let _this = this;let fns = _this.list[event];if (!fns) return false;if (!fn) {fns.length = 0;} else {for (let i = 0; i < fns.length; i++) {if (fns[i] === fn || fns[i].fn === fn) {fns.splice(i, 1);break;}}}}
};const user1 = (content) => {console.log("用户1订阅了:", content);
};const user2 = (content) => {console.log("用户2订阅了:", content);
};const user3 = (content) => {console.log("用户3订阅了:", content);
};// 订阅
eventEmitter.on("article1", user1);
eventEmitter.on("article1", user2);
eventEmitter.on("article2", user3);eventEmitter.emit("article1", "Javascript 发布-订阅模式");
eventEmitter.emit("article2", "Javascript 观察者模式");eventEmitter.off("article1", user1);
eventEmitter.emit("article1", "Javascript 发布-订阅模式");//用户1订阅了: Javascript 发布-订阅模式
//用户2订阅了: Javascript 发布-订阅模式
//用户3订阅了: Javascript 观察者模式
//用户2订阅了: Javascript 发布-订阅模式

总结

学习设计模式不仅可以使我们用好这些成功的设计模式,更重要的是可以使我们深入理解面向对象的设计思想。

~

~本文完,感谢阅读!

~

学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

大家好,我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

你来,怀揣期望,我有墨香相迎! 你归,无论得失,唯以余韵相赠!

知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!

几种常用设计模式的简单示例相关推荐

  1. 23种常用设计模式的UML类图

    23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源码)与<设计模式:可复用面向对象软件的基础>(源码)两书中介绍的设计模式与UML图. 整 ...

  2. javaEE Design Patter(1)初步了解23种常用设计模式

    设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. ...

  3. java几种常用设计模式简单示例

    1.单例设计模式 所谓单例设计模式简单说就是无论程序如何运行,采用单例设计模式的类(Singleton类)永远只会有一个实例化对象产生.具体实现步骤如下: (1) 将采用单例设计模式的类的构造方法私有 ...

  4. 呕心整理Java中的12种常用设计模式以及应用场景

    目录 单例模式 饿汉模式 懒汉模式 线程锁模式 双重判断模式 静态内部类模式 策略模式 工厂模式 简单工厂 抽象工厂 门面模式 装饰器模式 责任链模式 享元模式 观察者模式 代理模式 静态代理模式 动 ...

  5. 23种常用设计模式(C++)

     Part One: Methods for constrcting a new object: 1. Factory method 我们把简单工厂方法归类到工厂方法中.工厂方法的目的是用来解决具 ...

  6. 五种常用设计模式的python实现:单例、工厂、构建者、代理、观察模式

    这里写自定义目录标题 前言 1.单例模式 第 1 种,重写 __new__ 方法 第 2 种,闭包定义装饰器 2.工厂模式 第 1 种,简单工厂 第 2 种,工厂方法 第 3 种,抽象工厂 3.构建者 ...

  7. 几种软件设计模式简述以及示例

    工厂模式(Factory Pattern) 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行.创建过程在其子类执行. 优点: 1.一个调用者想创建一个对象 ...

  8. C++几种常用设计模式

    1.设计模式 面向过程通过划分功能模块,通过函数相互间的调用来实现,但需求变化时,就需要更改函数.而你改动的函数有多少的地方在调用他关联多少数据,这是很不容易弄得清楚的地方. 通过选择合适得设计模式可 ...

  9. java学习之三种常用设计模式

    一.适配器设计模式 简单来说,就是通过一个间接类来选择性的来覆写一个接口 interface Window{public void open() ; // 打开窗口public void close( ...

最新文章

  1. TVM自定义数据类型
  2. 「AHOI / HNOI2018」转盘 解题报告
  3. Table '' is marked as crashed and should be repaired 解决方法
  4. Git 技术篇 - git remote修改、移除仓库源的使用方法,git添加仓库源提示fatal: remote origin already exists.问题解决
  5. eureka自我保护机制及配置
  6. 页面缓存导致数据错误
  7. java 上传文件编码_(java)有什么办法把MultipartFile上传的文件转为utf-8的编码吗
  8. 乡村野生草药_官方野生蝇群流口水分数
  9. LeetCode 96. 不同的二叉搜索树(DP)
  10. @echo off是什么意思_高街、BF、FOG、OS风。。。都是些什么鬼?
  11. 不支持对系统目录进行即席更新
  12. [转]TortoiseSVN客户端的安装
  13. hive不在同一台机 hue_【Impala篇】---Hue从初始到安装应用
  14. 白话布隆过滤器BloomFilter
  15. 代理是什么及如何使用
  16. QQ互联登录- 前端为 vue.js
  17. MATLAB 批量改文件后缀
  18. Matlab与V-REP联合仿真 | Joint simulation of MATLAB and V-REP
  19. 01-使用Camera Raw滤镜调色
  20. 沈询 java进阶,7细品这杯香浓的咖啡 阿里中间件高级专家沈询的JAVA之旅

热门文章

  1. SQLSERVER误删除了Windows登录用户验证方式使用Windows身份验证的解决方法
  2. C#中“使用”的用途是什么
  3. Polymer元素和AngularJS指令有什么区别?
  4. 取消链接文件失败。 我应该再试一次吗?
  5. bo dto java vo_Java 键对象 KO (key object) 介绍
  6. python3文档字符串_python3基础:字符串、文本文件
  7. MTK:BMT充电模块
  8. 开源linux 二进制工具,谷歌开源二进制文件对比工具 BinDiff
  9. 1470. 重新排列数组
  10. n 的第 k 个因子