系列文章目录
例如:第一章 设计模式案例
前言
上一篇文章介绍了常用的几种设计模式和常用场景,便于对设计模式加深理解,此文章主要讲解设计模式的案例。
一、适配器模式
case 包
代码如下(示例):
package _case import "fmt" func AdapterCase() { var cache StdCache redis := &Redis{data: map[string]string{}} cache = &RedisAdapter{redis: redis} cache.Set("key1", "value1") cache.Set("key2", "value2") cache.Set("key3", "value3") fmt.Println(cache.Get("key1")) fmt.Println(cache.Get("key2")) fmt.Println(cache.Get("key3")) mem := &MemCache{data: map[string]interface{}{}} cache = &MemCacheAdapter{mem: mem} cache.Set("k1", "v1") cache.Set("k2", "v2") cache.Set("k3", "v3") fmt.Println(cache.Get("k1")) fmt.Println(cache.Get("k2")) fmt.Println(cache.Get("k3")) } type Redis struct { data map[string]string } func (r *Redis) GetStr(key string) string { return r.data[key] } func (r *Redis) SetStr(key, value string) { r.data[key] = value } type MemCache struct { data map[string]interface{} } func (m *MemCache) GetItem(key string) interface{} { return m.data[key] } func (m *MemCache) SetItem(key string, value interface{}) { m.data[key] = value } // 定义标准缓存 type StdCache interface { Get(key string) string Set(key, value string) } // 定义Redis适配器 type RedisAdapter struct { redis *Redis } func (adapter *RedisAdapter) Get(key string) string { return adapter.redis.GetStr(key) } func (adapter *RedisAdapter) Set(key, value string) { adapter.redis.SetStr(key, value) } // 定义MemCache适配器 type MemCacheAdapter struct { mem *MemCache } func (adapter *MemCacheAdapter) Get(key string) string { return adapter.mem.GetItem(key).(string) } func (adapter *MemCacheAdapter) Set(key, value string) { adapter.mem.SetItem(key, value) }
代码如下(示例):main
package main import _case "adapter/case" func main() { _case.AdapterCase() }
二、观察者模式
case 包
代码如下(示例):case 包
package _case import ( "fmt" ) func ObserverCase() { var ob Observer = &WatchConf{} var ob1 Observer = &WatchConf{} var ob2 Observer = &WatchConf{} var ob3 Observer = &WatchConf{} var pb Publisher = &Config{data: map[string]string{"host": "localhost", "port": "5051"}} //订阅 pb.Subscribe(ob) pb.Subscribe(ob1) pb.Subscribe(ob2) pb.Subscribe(ob3) fmt.Println(pb) pb.UnSubscribe(ob1) fmt.Println(pb) conf := pb.(*Config) // 断言 判断pb 类型 conf.data = map[string]string{"host": "127.0.0.1", "port": "9998"} pb.NotityObserver(conf.data) fmt.Println(pb) } // 定义观察者接口 type Observer interface { Update(data interface{}) } // 定义发布者 type Publisher interface { //关注 Subscribe(observer Observer) //取关 UnSubscribe(observer Observer) //通知 NotityObserver(data interface{}) } // 定义具体发布者 type Config struct { data map[string]string Observers []Observer } // 关注 func (c *Config) Subscribe(o Observer) { c.Observers = append(c.Observers, o) } // 取关 func (c *Config) UnSubscribe(o Observer) { for i, v := range c.Observers { if v == o { c.Observers = append(c.Observers[:i], c.Observers[i+1:]...) break } } } // 通知观察者 func (c *Config) NotityObserver(data interface{}) { for _, ob := range c.Observers { ob.Update(data) } } type WatchConf struct { } func (*WatchConf) Update(data interface{}) { fmt.Println("受到配置更新消息,更新配置为:", data) }
代码如下(示例):main
package main import _case "observer/case" func main() { _case.ObserverCase() }
三、代理模式
case 包
代码如下(示例):case 包
package _case import "fmt" func ProxyCase() { var cache Icache cache = &Cache{data: map[string]interface{}{}} proxy := NewProxy(cache) proxy.Set("key1", "value1") proxy.Set("key2", "value2") proxy.Set("key3", "value3") proxy.Set("key4", "value4") fmt.Println(proxy.Get("key1")) fmt.Println(proxy.Get("key2")) fmt.Println(proxy.Get("key3")) fmt.Println(proxy.Get("key4")) } type Icache interface { Get(key string) interface{} Set(key string, value interface{}) } // 被代理对象(真实对象) type Cache struct { data map[string]interface{} } func (c *Cache) Get(key string) interface{} { return c.data[key] } func (c *Cache) Set(key string, value interface{}) { c.data[key] = value } // 代理对象 type Proxy struct { cache Icache } func NewProxy(cache Icache) *Proxy { return &Proxy{ cache: cache, } } func (p *Proxy) Get(key string) interface{} { // 此处可以增加访问控制逻辑等扩展功能 return p.cache.Get(key) } func (p *Proxy) Set(key string, value interface{}) { // 此处可以增加访问控制逻辑等扩展功能 p.cache.Set(key, value) }
代码如下(示例):main
package main import _case "design-pattern/proxy/case" func main() { _case.ProxyCase() }
总结
提示:这里对文章进行总结:
以上就是今天要讲的内容,本文暂时讲解了部分设计模式案例,后期会在此处持续更新