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
|
package proxy
|
||||||
|
|
||||||
type Subject interface {
|
import "errors"
|
||||||
Do() string
|
|
||||||
|
////////////////////////////////
|
||||||
|
//用一个代理注册公司的例子,正向代理
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
|
//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{}
|
//Pioneer 一个创业者
|
||||||
|
type Pioneer struct {
|
||||||
func (RealSubject) Do() string {
|
AccountMoney int
|
||||||
return "real"
|
NationKind Nation
|
||||||
}
|
}
|
||||||
|
|
||||||
type Proxy struct {
|
//RegisterCompany 创业者要注册公司
|
||||||
real RealSubject
|
func (p Pioneer) RegisterCompany(companyName string) (name, enterpriseNo string, err error) {
|
||||||
|
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Proxy) Do() string {
|
//Conndition 注册条件
|
||||||
var res string
|
func (p Pioneer) Conndition() (money int, kind Nation) {
|
||||||
|
money = p.AccountMoney
|
||||||
// 在调用真实对象之前的工作,检查缓存,判断权限,实例化真实对象等。。
|
kind = p.NationKind
|
||||||
res += "pre:"
|
return
|
||||||
|
}
|
||||||
// 调用真实对象
|
|
||||||
res += p.real.Do()
|
//RegistryProxyCompany 代注公司,帮用户注册,对用户来讲,可以当成工商局来看待.
|
||||||
|
type RegistryProxyCompany struct {
|
||||||
// 调用之后的操作,如缓存结果,对结果进行处理等。。
|
p IPioneer
|
||||||
res += ":after"
|
}
|
||||||
|
|
||||||
return res
|
//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
|
package proxy
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
func TestProxy(t *testing.T) {
|
func TestProxy(t *testing.T) {
|
||||||
var sub Subject
|
|
||||||
sub = &Proxy{}
|
|
||||||
|
|
||||||
res := sub.Do()
|
proxyCompany := RegistryProxyCompany{p: Pioneer{10000, UK}}
|
||||||
|
|
||||||
if res != "pre:real:after" {
|
//想注册一个叫fire company 的公司
|
||||||
t.Fail()
|
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