From 911fc9d50ba3e4d2b5dd3a3da1f42fd7c34897a3 Mon Sep 17 00:00:00 2001 From: Edward Date: Thu, 30 Apr 2020 17:47:41 +0800 Subject: [PATCH] finish proxy pattern --- structure/09_proxy/README.md | 24 +++++----- structure/09_proxy/proxy.go | 80 +++++++++++++++++++++++--------- structure/09_proxy/proxy_test.go | 31 ++++++++++--- 3 files changed, 97 insertions(+), 38 deletions(-) diff --git a/structure/09_proxy/README.md b/structure/09_proxy/README.md index 11759f6..8d1a08f 100644 --- a/structure/09_proxy/README.md +++ b/structure/09_proxy/README.md @@ -2,17 +2,19 @@ 代理模式用于延迟处理操作或者在进行实际操作前后进行其它处理。 -代理模式看起似乎像中介者(中间人)模式,一定要明确两者是完全的不同的模式,目标应用场景是完全不同的。 +代理模式看起似乎像中介者(中间人)模式,一定要明确两者是完全的不同的模式,目标应用场景完全不同。 -+ 代理模式强调的是对一方对象的隐藏,强调的是单向数据流下,对一方到另一方数据的过滤和拦截。 -+ 中间人模式中的两方对象是地位平等的会话关系,中间人代表的是两边,持有两边的信息,比如房东和中介房客和中介,中间人是一个传话筒,同时代表两边. +代理模式强调的是对一方的隐藏,对另一方则是完全透明的 +代理模式,在动作上,强调的是在单向数据流下,对一方到另一方数据的在进一步转发前,会进行必要的过滤、拦截,校验等操作. -## 代理模式的常见用法有 +中间人模式中的两方对象是地位平等的会话关系,中间人代表的是两边,持有两边的信息,比如房东和中介,房客和中介,中间人同时代表两边. -+ 虚代理 -+ 远程代理 -+ 保护代理 -+ Cache代理 -+ 防火墙代理 -+ 同步代理 -+ 智能指引 +现实生活中,代记账公司,代注册工程是最形象的代理模式之一,当你想注册公司的时候,不要自己直接跟工商局打交道,搞各种材料,交给代理公司,代理公司会替你做这些乱七八糟的时候,然后给你一个结果。 + +## 在我们的应用系统中常见的代理有 + ++ nginx流量代理(反向) ++ 上网代理(正向) ++ 防火墙代理(保护内部) + +对于被代理的的一侧,往往都是需要针对代理进行一定配置,对另一层是透明的,代注公司代理用户,需要需要针对用户做一些配置和了解。对于工商局来说,工作过程中,代理可以认为是透明的,本质上,工商局只是在和用户(的信息)打交道. diff --git a/structure/09_proxy/proxy.go b/structure/09_proxy/proxy.go index d0b374d..bdc9b4e 100644 --- a/structure/09_proxy/proxy.go +++ b/structure/09_proxy/proxy.go @@ -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 + } diff --git a/structure/09_proxy/proxy_test.go b/structure/09_proxy/proxy_test.go index 8ddd8b1..c027277 100644 --- a/structure/09_proxy/proxy_test.go +++ b/structure/09_proxy/proxy_test.go @@ -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) } }