mirror of
https://github.com/crazybber/go-pattern-examples.git
synced 2024-11-25 13:16:02 +03:00
finish proxy pattern
This commit is contained in:
parent
fe0152db45
commit
911fc9d50b
@ -2,17 +2,19 @@
|
||||
|
||||
代理模式用于延迟处理操作或者在进行实际操作前后进行其它处理。
|
||||
|
||||
代理模式看起似乎像中介者(中间人)模式,一定要明确两者是完全的不同的模式,目标应用场景是完全不同的。
|
||||
代理模式看起似乎像中介者(中间人)模式,一定要明确两者是完全的不同的模式,目标应用场景完全不同。
|
||||
|
||||
+ 代理模式强调的是对一方对象的隐藏,强调的是单向数据流下,对一方到另一方数据的过滤和拦截。
|
||||
+ 中间人模式中的两方对象是地位平等的会话关系,中间人代表的是两边,持有两边的信息,比如房东和中介房客和中介,中间人是一个传话筒,同时代表两边.
|
||||
代理模式强调的是对一方的隐藏,对另一方则是完全透明的
|
||||
代理模式,在动作上,强调的是在单向数据流下,对一方到另一方数据的在进一步转发前,会进行必要的过滤、拦截,校验等操作.
|
||||
|
||||
## 代理模式的常见用法有
|
||||
中间人模式中的两方对象是地位平等的会话关系,中间人代表的是两边,持有两边的信息,比如房东和中介,房客和中介,中间人同时代表两边.
|
||||
|
||||
+ 虚代理
|
||||
+ 远程代理
|
||||
+ 保护代理
|
||||
+ Cache代理
|
||||
+ 防火墙代理
|
||||
+ 同步代理
|
||||
+ 智能指引
|
||||
现实生活中,代记账公司,代注册工程是最形象的代理模式之一,当你想注册公司的时候,不要自己直接跟工商局打交道,搞各种材料,交给代理公司,代理公司会替你做这些乱七八糟的时候,然后给你一个结果。
|
||||
|
||||
## 在我们的应用系统中常见的代理有
|
||||
|
||||
+ nginx流量代理(反向)
|
||||
+ 上网代理(正向)
|
||||
+ 防火墙代理(保护内部)
|
||||
|
||||
对于被代理的的一侧,往往都是需要针对代理进行一定配置,对另一层是透明的,代注公司代理用户,需要需要针对用户做一些配置和了解。对于工商局来说,工作过程中,代理可以认为是透明的,本质上,工商局只是在和用户(的信息)打交道.
|
||||
|
@ -1,30 +1,68 @@
|
||||
package proxy
|
||||
|
||||
type Subject interface {
|
||||
Do() string
|
||||
import "errors"
|
||||
|
||||
////////////////////////////////
|
||||
//用一个代理注册公司的例子,正向代理
|
||||
////////////////////////////////
|
||||
|
||||
//Nation 国籍
|
||||
type Nation int
|
||||
|
||||
//nation catalog
|
||||
const (
|
||||
CN Nation = iota
|
||||
UK
|
||||
JP
|
||||
)
|
||||
|
||||
//IPioneer 一个创业者,要注册公司
|
||||
type IPioneer interface {
|
||||
RegisterCompany(companyName string) (name, enterpriseNo string, err error)
|
||||
|
||||
Conndition() (money int, kind Nation)
|
||||
}
|
||||
|
||||
type RealSubject struct{}
|
||||
|
||||
func (RealSubject) Do() string {
|
||||
return "real"
|
||||
//Pioneer 一个创业者
|
||||
type Pioneer struct {
|
||||
AccountMoney int
|
||||
NationKind Nation
|
||||
}
|
||||
|
||||
type Proxy struct {
|
||||
real RealSubject
|
||||
//RegisterCompany 创业者要注册公司
|
||||
func (p Pioneer) RegisterCompany(companyName string) (name, enterpriseNo string, err error) {
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (p Proxy) Do() string {
|
||||
var res string
|
||||
|
||||
// 在调用真实对象之前的工作,检查缓存,判断权限,实例化真实对象等。。
|
||||
res += "pre:"
|
||||
|
||||
// 调用真实对象
|
||||
res += p.real.Do()
|
||||
|
||||
// 调用之后的操作,如缓存结果,对结果进行处理等。。
|
||||
res += ":after"
|
||||
|
||||
return res
|
||||
//Conndition 注册条件
|
||||
func (p Pioneer) Conndition() (money int, kind Nation) {
|
||||
money = p.AccountMoney
|
||||
kind = p.NationKind
|
||||
return
|
||||
}
|
||||
|
||||
//RegistryProxyCompany 代注公司,帮用户注册,对用户来讲,可以当成工商局来看待.
|
||||
type RegistryProxyCompany struct {
|
||||
p IPioneer
|
||||
}
|
||||
|
||||
//RegisterCompany 代表用户注册公司
|
||||
func (r RegistryProxyCompany) RegisterCompany(companyName string) (name, enterpriseNo string, err error) {
|
||||
|
||||
//检查注册人的,资金,姓名,
|
||||
money, nation := r.p.Conndition()
|
||||
|
||||
if money < 10000 || nation != CN {
|
||||
return "", "", errors.New("Condition not OK")
|
||||
}
|
||||
////////////////////////////////
|
||||
///发送请求到工商局
|
||||
////////////////////////////////
|
||||
|
||||
name = companyName
|
||||
enterpriseNo = "abvdefe12450"
|
||||
|
||||
return name, enterpriseNo, err
|
||||
|
||||
}
|
||||
|
@ -1,14 +1,33 @@
|
||||
package proxy
|
||||
|
||||
import "testing"
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestProxy(t *testing.T) {
|
||||
var sub Subject
|
||||
sub = &Proxy{}
|
||||
|
||||
res := sub.Do()
|
||||
proxyCompany := RegistryProxyCompany{p: Pioneer{10000, UK}}
|
||||
|
||||
if res != "pre:real:after" {
|
||||
t.Fail()
|
||||
//想注册一个叫fire company 的公司
|
||||
name, no, err := proxyCompany.RegisterCompany("fire company")
|
||||
|
||||
if err != nil {
|
||||
t.Log("something wrong:", err.Error())
|
||||
} else {
|
||||
|
||||
t.Log("got company, name:", name, "company no:", no)
|
||||
|
||||
}
|
||||
|
||||
proxyCompany = RegistryProxyCompany{p: Pioneer{109999, CN}}
|
||||
|
||||
//想注册一个叫fire company 的公司
|
||||
name, no, err = proxyCompany.RegisterCompany("water company")
|
||||
|
||||
if err != nil {
|
||||
t.Log("something wrong:", err.Error())
|
||||
} else {
|
||||
|
||||
t.Log("got company, name:", name, "company no:", no)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user