下面举个例子,比如我们给页面中的一个dom节点绑定一个事件,其实就可以看做是一种观察者模式:
document.body.addEventListener("click", function() { alert("Hello World")},false )document.body.click() //模拟用户点击总结:在上面的例子中,需要监听用户点击 document.body 的动作,但是我们是没办法预知用户将在什么时候点击的,因此我们订阅了 document.body 的 click 事件,当 body 节点被点击时,body 节点便会向订阅者发布 "Hello World" 消息 。
策略模式策略模式指的是定义一些列的算法,把他们一个个封装起来,目的就是将算法的使用与算法的实现分离开来,避免多重判断条件,更具有扩展性 。
下面也是举个例子,现在超市有活动,vip为5折,老客户3折,普通顾客没折,计算最后需要支付的金额,如果不使用策略模式,我们的代码可能和下面一样:
function Price(personType, price) { //vip 5 折 if (personType == 'vip') { return price * 0.5; }else if (personType == 'old'){ //老客户 3 折 return price * 0.3; } else { return price; //其他都全价 }}在上面的代码中,我们需要很多个判断,如果有很多优惠,我们又需要添加很多判断,这里已经违背了刚才说的设计模式的六大原则中的开闭原则了,如果使用策略模式,我们的代码可以这样写:
// 对于vip客户function vipPrice() { this.discount = 0.5;} vipPrice.prototype.getPrice = function(price) { return price * this.discount;}// 对于老客户function oldPrice() { this.discount = 0.3;} oldPrice.prototype.getPrice = function(price) { return price * this.discount;}// 对于普通客户function Price() { this.discount = 1;} Price.prototype.getPrice = function(price) { return price ;}// 上下文,对于客户端的使用function Context() { this.name = ''; this.strategy = null; this.price = 0;} Context.prototype.set = function(name, strategy, price) { this.name = name; this.strategy = strategy; this.price = price;}Context.prototype.getResult = function() { console.log(this.name + ' 的结账价为: ' + this.strategy.getPrice(this.price));}var context = new Context();var vip = new vipPrice();context.set ('vip客户', vip, 200);context.getResult(); // vip客户 的结账价为: 100var old = new oldPrice();context.set ('老客户', old, 200);context.getResult(); // 老客户 的结账价为: 60var Price = new Price();context.set ('普通客户', Price, 200);context.getResult(); // 普通客户 的结账价为: 200总结:在上面的代码中,通过策略模式,使得客户的折扣与算法解藕,又使得修改跟扩展能独立的进行,不影到客户端或其他算法的使用 。
当我们的代码中有很多个判断分支,每一个条件分支都会引起该“类”的特定行为以不同的方式作出改变,这个时候就可以使用策略模式,可以改进我们代码的质量,也更好的可以进行单元测试 。
最后每天发布更多新鲜有含量的技术文章、总有一款适合你 。
快关注我、把我打包带走、每天提醒你学习一手技术 。
推荐阅读
- 如何选购正宗的正山小种红茶 购买正山小种需要注意这6大点
- 五大最流行的破解工具,让你从此走遍黑客世界
- 怎么做大虾好吃 做虾怎么做
- 曲奇的配方比例 曲奇怎么做
- 肉夹馍卤肉怎么做 卤肉怎么做
- 男生的生殖长一般多大 男人的生殖器多长多大才标准
- 小暑和大暑哪个更热 2021小暑大暑哪个更热
- 大麦茶|职场妈妈怕涨奶,想提前给孩子断奶,谁有经验?煮东北大麦茶!
- |大连一男子伪装成农民工去工厂找工作!只为盗取现金
- 化妆品|美容行业九大痛苦现状,如何解决生存之道?
