Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit eb13a47

Browse files
committed
a part of proxy pattern
1 parent ba6c964 commit eb13a47

File tree

3 files changed

+179
-0
lines changed

3 files changed

+179
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Created by .ignore support plugin (hsz.mobi)
2+
/.idea/

proxy/Proxy.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*代理模式的关键是,当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,
2+
* 客户实际上访问的是替身对象。替身对象对请求做出一些处理之后,再把请求转交给本体对象。*/
3+
4+
//1.第一个例子,小明追MM的故事
5+
/*小明有个喜欢的女孩为A,他想给A送一束花来表白。刚好小明打听到A和他有一个共同的朋友B,于是内向的小明决定让B来代替自己完成送花这件事。
6+
* (虽然小明的故事必然以悲剧收场,因为追MM更好的方式是送一辆宝马,嘻嘻)*/
7+
var Flower = function(){};
8+
9+
var xiaoming = {
10+
sendFlower:function(target){
11+
var flower = new Flower();
12+
target.receiveFlower(flower);
13+
}
14+
};
15+
16+
var B = {
17+
receiveFlower:function(flower){
18+
A.receiveFlower(flower);
19+
}
20+
};
21+
22+
var A = {
23+
receiveFlower:function(flower){
24+
console.log('收到花 ' + flower);
25+
}
26+
};
27+
28+
xiaoming.sendFlower(B);
29+
30+
/*上述代码,代理模式只是简单地把请求转交给本体。假设A在心情好的时候收到花的成功几率为60%,而在心情差的时候收到花的成功几率几乎为0.则需要B今天A的心情。*/
31+
var Flower1 = function(){};
32+
33+
var xiaoming1 = {
34+
sendFlower:function(target){
35+
var flower = new Flower();
36+
target.receiveFlower(flower);
37+
}
38+
};
39+
40+
var B1 = {
41+
receiveFlower:function(flower){
42+
A1.listenGoodMood(function(){
43+
A1.receiveFlower(flower);
44+
});
45+
}
46+
};
47+
48+
var A1 = {
49+
receiveFlower:function(flower){
50+
console.log('收到花 ' + flower);
51+
},
52+
listenGoodMood:function(fn){
53+
setTimeout(function(){
54+
fn();
55+
},10000);
56+
}
57+
};
58+
59+
xiaoming1.sendFlower(B1);
60+
61+
/*保护代理:代理B可以帮助A过滤掉一些请求,比如送花的人中年龄太大的或者没有宝马的。
62+
* 虚拟代理:虚拟代理把一些开销很大的对象,延迟到真正需要它的时候才去创建。
63+
* 下面为虚拟代理的例子:*/
64+
var B2 = {
65+
receiveFlower:function(flower){
66+
A1.listenGoodMood(function(){
67+
var flower = new Flower(); //延迟创建flower对象
68+
A.receiveFlower(flower);
69+
});
70+
}
71+
}
72+

strategy/formExample.html

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>Form Validation</title>
6+
</head>
7+
<body>
8+
<form action="" id="registerForm" method="post">
9+
请输入用户名:<input type="text" name="userName"/>
10+
请输入密码:<input type="text" name="password"/>
11+
请输入手机号码:<input type="text" name="phoneNumber"/>
12+
<button id="sbmit">提交</button>
13+
</form>
14+
15+
<script>
16+
/******************策略对象*****************/
17+
var strategies = {
18+
isNonEmpty:function(value,errMsg){
19+
if(value === ''){
20+
return errMsg;
21+
}
22+
},
23+
minLength:function(value,length,errMsg){
24+
if(value.length<length){
25+
return errMsg;
26+
}
27+
},
28+
isMobile:function(value,errMsg){
29+
if(!/(^1[3|5|8][0-9]{9}$)/.test(value)){
30+
return errMsg;
31+
}
32+
}
33+
};
34+
35+
/******************Validator 类*****************/
36+
var Validator = function(){
37+
this.cache = [];
38+
}
39+
40+
Validator.prototype.add = function(dom,rules){
41+
var self = this;
42+
for(var i = 0,rule;rule = rules[i++];){
43+
(function(rule){
44+
var strategyAry = rule.strategy.split(":");
45+
var errMsg = rule.errMsg;
46+
self.cache.push(function(){
47+
var strategy = strategyAry.shift();
48+
strategyAry.unshift(dom.value);
49+
strategyAry.push(errMsg);
50+
return strategies[strategy].apply(dom,strategyAry);
51+
});
52+
})(rule);
53+
}
54+
};
55+
56+
Validator.prototype.start = function(){
57+
for(var i = 0, validatorFunc;validatorFunc = this.cache[i++];){
58+
var errMsg = validatorFunc();
59+
if(errMsg){
60+
return errMsg;
61+
}
62+
}
63+
};
64+
65+
/******************客户调用代码*****************/
66+
var registerForm = document.getElementById('registerForm');
67+
68+
var validataFunc = function(){
69+
var validator = new Validator();
70+
71+
validator.add(registerForm.userName,[{
72+
strategy:'isNonEmpty',
73+
errMsg:'用户名不能为空'
74+
},{
75+
strategy:'minLength:6',
76+
errMsg:'用户名长度不能小于6位'
77+
}]);
78+
79+
validator.add(registerForm.password,[{
80+
strategy:'minLength:6',
81+
errMsg:'密码长度不能小于6位'
82+
}]);
83+
84+
validator.add(registerForm.phoneNumber,[{
85+
strtegy:'isMobile',
86+
errMsg:'手机号码格式不正确'
87+
}]);
88+
89+
var errMsg = validator.start();
90+
return errMsg;
91+
}
92+
93+
registerForm.onsubmit = function(){
94+
var errMsg = validataFunc();
95+
if(errMsg){
96+
alert(errMsg);
97+
return false;
98+
}
99+
}
100+
document.getElementById('sbmit').onclick = function(){
101+
registerForm.onsubmit();
102+
}
103+
</script>
104+
</body>
105+
</html>

0 commit comments

Comments
 (0)