根据百度百科的介绍:
策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。
策略模式:
-
定义了一组算法(业务规则);
-
封装了每个算法;
-
这族的算法可互换代替(interchangeable)。
举个例子,一个游戏项目需要的所有对音乐音效的操作都放在一个music音乐类中进行控制
/**
* 音乐模块只希望被外部调用而不能修改,因此以立即执行函数表达式的方式进行封装
* 在一个模块即具备属性,又具备方法的时候,可以使用立即执行函数表达式进行封装
*/
这个时候就采用策略模式封装,能够让程序更加灵活,但是客户端需要知道有哪些可以使用
let music = (function () {
let res = {};
let isMusicPlaying = null;
/**音乐 */
//播放 、 暂停 、 重播 、 停止 、 循环 、 音量
res.playMusic = function (clip, isloop = true,volume = 0.5) {
if (isMusicPlaying) {
cc.audioEngine.stopMusic();
}
cc.audioEngine.playMusic(clip, isloop)
cc.audioEngine.setMusicVolume(volume);
isMusicPlaying = clip;
}
//音量:设置音量、获取音量、静音
res.setMusic = function (volume) {
cc.audioEngine.setMusicVolume(volume);
}
res.getMusic = function () {
return cc.audioEngine.getMusicVolume();
}
res.setMute = function () {
//记录当前音量是多少
let curVolume = cc.audioEngine.getMusicVolume();
cc.audioEngine.setMusicVolume(0);
return curVolume;
}
/**音效 */
//播放 、 音量
res.playEffect = function (clip, isloop = false) {
cc.audioEngine.playEffect(clip,isloop);
}
res.setEffect = function (volume){
cc.audioEngine.setEffectsVolume(volume);
}
return res;
})()
module.exports = music;
并在单例类中声明引用
gameData.music = require("./music");
这样就可以在你的代码中直接使用了
gameData.music.playMusic(gameData.storeHouse.audio["bgMusic"]);