finish proxy pattern

This commit is contained in:
Edward 2020-04-30 17:47:41 +08:00
parent fe0152db45
commit 911fc9d50b
3 changed files with 97 additions and 38 deletions

View File

@ -2,17 +2,19 @@
代理模式用于延迟处理操作或者在进行实际操作前后进行其它处理。 代理模式用于延迟处理操作或者在进行实际操作前后进行其它处理。
代理模式看起似乎像中介者(中间人)模式,一定要明确两者是完全的不同的模式,目标应用场景完全不同 代理模式看起似乎像中介者(中间人)模式,一定要明确两者是完全的不同的模式,目标应用场景完全不同。
+ 代理模式强调的是对一方对象的隐藏,强调的是单向数据流下,对一方到另一方数据的过滤和拦截。 代理模式强调的是对一方的隐藏,对另一方则是完全透明的
+ 中间人模式中的两方对象是地位平等的会话关系,中间人代表的是两边,持有两边的信息,比如房东和中介房客和中介,中间人是一个传话筒,同时代表两边. 代理模式,在动作上,强调的是在单向数据流下,对一方到另一方数据的在进一步转发前,会进行必要的过滤、拦截,校验等操作.
## 代理模式的常见用法有 中间人模式中的两方对象是地位平等的会话关系,中间人代表的是两边,持有两边的信息,比如房东和中介,房客和中介,中间人同时代表两边.
+ 虚代理 现实生活中,代记账公司,代注册工程是最形象的代理模式之一,当你想注册公司的时候,不要自己直接跟工商局打交道,搞各种材料,交给代理公司,代理公司会替你做这些乱七八糟的时候,然后给你一个结果。
+ 远程代理
+ 保护代理 ## 在我们的应用系统中常见的代理有
+ Cache代理
+ 防火墙代理 + nginx流量代理(反向)
+ 同步代理 + 上网代理(正向)
+ 智能指引 + 防火墙代理(保护内部)
对于被代理的的一侧,往往都是需要针对代理进行一定配置,对另一层是透明的,代注公司代理用户,需要需要针对用户做一些配置和了解。对于工商局来说,工作过程中,代理可以认为是透明的,本质上,工商局只是在和用户(的信息)打交道.

View File

@ -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
} }

View File

@ -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)
} }
} }