-
Notifications
You must be signed in to change notification settings - Fork 104
/
Copy pathProxy.go
90 lines (74 loc) · 1.92 KB
/
Proxy.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package pattern
import (
"errors"
"fmt"
)
// 代理模式
// 为其他对象提供一种代理以控制对这个对象的访问
// 优点: 1、职责清晰。 2、高扩展性。 3、智能化。
// 注意事项:
// 1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,
// 而代理模式不能改变所代理类的接口。
// 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式
// 是为了加以控制。
// 似乎有点像装饰模式
type Device interface {
Read()([]byte,error)
Write(word []byte)error
}
type HardDisk struct {
storage []byte
}
func(h *HardDisk)Read()([]byte,error){
return h.storage,nil
}
func(h *HardDisk)Write(word []byte)error{
h.storage=word
return nil
}
type HardDiskProxy struct {
OpId string
hd *HardDisk
}
func(h *HardDiskProxy)Read()([]byte,error){
if !h.permission("read") {
return nil ,errors.New("You don't have permission to read")
}
return h.hd.Read()
}
func(h *HardDiskProxy)Write(word []byte)error{
if !h.permission("wrire") {
return errors.New("You don't have permission to write")
}
return h.hd.Write(word)
}
// 权限判断
func(h *HardDiskProxy)permission(tag string)bool{
if h.OpId=="admin"{
return true
}
if h.OpId=="reader"&&tag=="read"{
return true
}
if h.OpId=="writer"&&tag=="wrire"{
return true
}
return false
}
func ProxyTest(){
var devI Device
devI=&HardDiskProxy{OpId:"admin",hd:&HardDisk{}}
devI.Write([]byte("Hello world!"))
data,_:=devI.Read()
fmt.Println(string(data))
devI=&HardDiskProxy{OpId:"reader",hd:&HardDisk{storage:[]byte("only read")}}
err:=devI.Write([]byte("Hello world!"))
fmt.Println(err.Error())
data,_=devI.Read()
fmt.Println(string(data))
devI=&HardDiskProxy{OpId:"writer",hd:&HardDisk{}}
err=devI.Write([]byte("only writer"))
fmt.Println(err)
data,err=devI.Read()
fmt.Println(string(data),err.Error())
}