⼩程序——设计模式(单例,状态模式,观察者模式、代理模式、策略模式
【表单验证】)
⽬录
1、单例模式
1. 定义
保证⼀个类仅有⼀个实例,并提供⼀个访问它的全局访问点
2. 核⼼
确保只有⼀个实例,并提供全局访问
第⼀种:类
// 单例
let __instance =(()=>{
let instance;
return(newInstance)=>{
if(newInstance) instance = newInstance;
return instance;
}
})();
class bleSdk {
constructor(){
if(__instance())return__instance();
this.foo ='bar';
__instance(this);
}
}
export{
bleSdk
};
js页⾯
import{bleSdk}from"../bleSdk"
Page({
data:{
},
onLoad(){
let ul =new bleSdk();
let ul2 =new bleSdk();
console.log("判断是否为单例",ul === ul2)//true
},
})
第⼆种:在某个⽅法⾥⾯使⽤
function SetManager(name){
this.manager = name;
console.log("初始化类", name)
}
Name=function(){
console.log(this.manager);
};
var SingletonSetManager =(function(){
var manager =null;//使⽤闭包缓存⼀个内部变量
return function(name){
if(!manager){
manager =new SetManager(name);
}
return manager;
}
})();
SingletonSetManager('a').getName();// a
SingletonSetManager('b').getName();// a
SingletonSetManager('c').getName();// a
2、状态模式
例⼦:⽐如超级玛丽,就可能同时有好⼏个状态⽐如 跳跃,移动,射击,蹲下 等,如果对这些动作⼀个个进⾏处理判断,需要多个if-else 或者switch不仅丑陋不说,⽽且在遇到有组合动作的时候,实现就会变的更为复杂,这⾥可以使⽤状态模式来实现。
const SuperMarry =(function(){
let _currentState =[],// 状态数组
states ={
jump(){
console.log('跳跃!')
},
move(){
console.log('移动!')
},
shoot(){
console.log('射击!')
},
squat(){
console.log('蹲下!')
}
}
const Action ={
changeState(arr){// 更改当前动作
_currentState = arr
return this
},
goes(){
console.log('触发动作')
_currentState.forEach(T=> states[T]&& states[T]()) return this
}
}
return{
change: Action.changeState,
go: s
}
})()
// 调⽤
SuperMarry.change(['jump','shoot'])
.go()// 触发动作跳跃! 射击!
.go()// 触发动作跳跃! 射击!
.change(['squat'])
.go()// 触发动作蹲下!
使⽤es6优化:
class SuperMarry {
constructor(){
this._currentState =[]
this.states ={
jump(){console.log('跳跃!')},
move(){console.log('移动!')},
shoot(){console.log('射击!')},
squat(){console.log('蹲下!')}
}
}
change(arr){// 更改当前动作
this._currentState = arr
return this
}
go(){
console.log('触发动作')
this._currentState.forEach(T=>this.states[T]&&this.states[T]())
return this
}
}
//使⽤
new SuperMarry()
.
change(['jump','shoot'])
单例模式的几种实现方式.go()// 触发动作跳跃! 射击!
.go()// 触发动作跳跃! 射击!
.change(['squat'])
.go()// 触发动作蹲下!
状态模式的使⽤场景也特别明确,有如下两点:
1. ⼀个对象的⾏为取决于它的状态,并且它必须在运⾏时刻根据状态改变它的⾏为。
2. ⼀个操作中含有⼤量的分⽀语句,⽽且这些分⽀语句依赖于该对象的状态。状态通常为⼀个或多个枚举常量的表⽰。简⽽⾔之,当遇到很多同级if-else或者switch的时候,可以使⽤状态模式来进⾏简化。
3、观察者模式
class Subject {
constructor(){
this.subs =[];
}
addSub(sub){//订阅
this.subs.push(sub);
console.log("XX订阅了:",this.subs)
}
removeSub(sub){//移除订阅
const idx =this.subs.findIndex(i => i === sub);
if(idx ===-1){
console.log('不存在该观察者');
return;
}
this.subs.splice(idx,1);
}
notify(){//通知
this.subs.forEach(sub =>{
sub.update();// 与观察者原型⽅法update对应!});
}
}
// 观察⼈,相当于订阅者
class Observer {
update(){
console.log('被动触发:update');
}
}
export{
Subject,
Observer
};
index.js使⽤:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论