Javascript面向对象之策略模式

这篇博客介绍了一个JavaScript代码示例,展示了如何通过策略模式来管理按钮高亮状态。首先,当选择两个按钮后阻止选择第三个按钮,然后扩展到实现当三个按钮都被选中后,随机取消其中一个高亮的状态。通过策略一、策略二和策略三的对比,解释了策略模式在处理不同业务逻辑时的灵活性。
摘要由CSDN通过智能技术生成

我们先看个简单的例子,再根据需求扩展。
在这里插入图片描述
在这里插入图片描述
现在有个需求,三个按钮中选择了两个之后就不能先择第三个了,我们怎么实现呢,代码实现如下:
在这里插入图片描述

class Client {
	constructor(nodes) {
	    this.nodes = [...nodes];
		this.initEvent();
	}
	
	initEvent() {
		this.nodes.forEach((item) => {
			item.addEventListener('click', (e) => {
				this.handleClick(e.target);
			});
		});
	}
	
	handleClick(ele) {
		//过滤节点
		const items = this.nodes.filter((item) => item.classList.contains('active')); 
		if(items.length === 2 && !items.includes(ele)) return;
		
		ele.classList.toggle('active');
	}
}

new Client(document.querySelectorAll('.box'));

现在又有个需求,三个按钮点击三个高亮之后,随机取消掉一个。这时候我们可以使用策略模式,策略一:点击某个高亮,策略二:最多只有两个高亮,策略三:点击三个按钮点击三个高亮之后,随机取消掉一个。

class Client {
	constructor(nodes, strategy) {
	    this.nodes = [...nodes];
		this.strategy = strategy;
		this.initEvent();
	}
	
	initEvent() {
		this.nodes.forEach((item) => {
			item.addEventListener('click', (e) => {
				this.handleClick(e.target);
			});
		});
	}
	
	handleClick(ele) {
		this.strategy.process(ele, this.nodes);
	}
}
	
//策略一
class Strategy1 {
	process(ele, nodes){
		ele.classList.toggle('active');
	}
}
//策略二
class Strategy2 {
	process(ele, nodes){
		const items = nodes.filter((item) => item.classList.contains('active'));
		if(items.length === 2 && !items.includes(ele)) return;

		ele.classList.toggle('active');
	}
}

//策略三
class Strategy3 {
	process(ele, nodes){
		ele.classList.toggle('active');
		//every()方法用于检测数组所有元素是否都符合指定条件
		if(nodes.every(item => item.classList.contains('active'))){
			//随机取消一个
			nodes.filter(item => item !== ele)[Math.floor(Math.random()*2)].classList.toggle('active');
		}
	}
}

new Client(document.querySelectorAll('.box'), new Strategy3());

策略三实现效果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值