设计模式案例(一)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 设计模式案例(一)

系列文章目录


例如:第一章 设计模式案例


前言


上一篇文章介绍了常用的几种设计模式和常用场景,便于对设计模式加深理解,此文章主要讲解设计模式的案例。


一、适配器模式


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


总结


提示:这里对文章进行总结:

以上就是今天要讲的内容,本文暂时讲解了部分设计模式案例,后期会在此处持续更新

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
设计模式 存储 Java
【设计模式——学习笔记】23种设计模式——备忘录模式Memento(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——备忘录模式Memento(原理讲解+应用场景介绍+案例介绍+Java代码实现)
85 0
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
设计模式 存储 Java
【设计模式——学习笔记】23种设计模式——迭代器模式Iterator(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——迭代器模式Iterator(原理讲解+应用场景介绍+案例介绍+Java代码实现)
47 0
|
3月前
|
设计模式 Java
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
文章提供了一份常用设计模式的全面介绍,包括创建型模式、结构型模式和行为型模式。每种设计模式都有详细的概念讲解、案例说明、代码实例以及运行截图。作者通过这些模式的介绍,旨在帮助读者更好地理解源码、编写更优雅的代码,并进行系统重构。同时,文章还提供了GitHub上的源码地址,方便读者直接访问和学习。
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
|
5月前
|
设计模式 算法 Java
Java中的设计模式:实战案例分享
Java中的设计模式:实战案例分享
|
6月前
|
设计模式 Java 关系型数据库
Java设计模式--创建模式工厂--用披萨订购案例 详细讲解三种工厂模式
Java设计模式--创建模式工厂--用披萨订购案例 详细讲解三种工厂模式
|
6月前
|
设计模式 存储 安全
NFT佛萨奇矩阵公排合约系统开发|案例分析|设计模式
区块链目前面临的另一个挑战是可扩展性问题
|
6月前
|
设计模式
设计模式案例 (三)
设计模式案例 (三)
37 0
|
6月前
|
设计模式
设计模式案例(二)
设计模式案例(二)
51 0
|
设计模式 Java 应用服务中间件
【设计模式——学习笔记】23种设计模式——职责链/责任链模式(Chain of Responsibility)(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——职责链/责任链模式(Chain of Responsibility)(原理讲解+应用场景介绍+案例介绍+Java代码实现)
140 0