设计模式案例(二)

简介: 设计模式案例(二)

系列文章目录


第一章 设计模式案例 (一)

第一章 设计模式案例 (二)


前言


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


一、责任链模式


case 包

代码如下(示例):

package _case
import "fmt"
func DutyCase() {
    pm := &ProjectManager{}
    dm := &DepartmentManager{}
    gm := &GeneralManager{}
    pm.SetNext(dm).SetNext(gm)
    pm.Handle("张三", 300)
    pm.Handle("李四", 800)
    pm.Handle("王五", 1800)
}
type Handler interface {
    SetNext(h Handler) Handler
    Handle(user string, amount int64)
}
// 项目经理
type ProjectManager struct {
    next Handler
}
func (pm *ProjectManager) Handle(user string, amount int64) {
    if amount <= 500 {
        fmt.Printf("%s 申请聚餐费用 %d 元,项目经理审批通过\n", user, amount)
        return
    }
    // 项目经理没有权限,交给下一个人处理
    pm.next.Handle(user, amount)
}
func (pm *ProjectManager) SetNext(h Handler) Handler {
    pm.next = h
    return h
}
// 部门经理
type DepartmentManager struct {
    next Handler
}
func (dm *DepartmentManager) Handle(user string, amount int64) {
    if amount > 500 && amount <= 1000 {
        fmt.Printf("%s 申请聚餐费用 %d 元,部门经理审批通过\n", user, amount)
        return
    } else if amount > 1000 {
        fmt.Printf("%s 申请聚餐费用 %d 元,部门经理审批通过,总经理加签\n", user, amount)
        dm.next.Handle(user, amount)
    } else {
        dm.next.Handle(user, amount)
    }
}
func (dm *DepartmentManager) SetNext(h Handler) Handler {
    dm.next = h
    return h
}
// 总经理
type GeneralManager struct {
    next Handler
}
func (gm *GeneralManager) Handle(user string, amount int64) {
    if amount > 1000 {
        fmt.Printf("%s 申请聚餐费用 %d 元,总经理审批通过\n", user, amount)
        return
    }
    gm.next.Handle(user, amount)
}
func (gm *GeneralManager) SetNext(h Handler) Handler {
    gm.next = h
    return h
}

代码如下(示例):main

package main
import _case "design-pattern/duty/case"
func main() {
    _case.DutyCase()
}

二、策略模式


case 包

代码如下(示例):

package _case
import "fmt"
func StrategyCase() {
  arr := []int{1, 3, 8, 2, 4, 5}
  arr1 := []int{5, 2, 4, 6, 9, 8}
  ctx := &Context{}
  //设置排序策略- 冒泡算法
  ctx.SetStrategy(&bubble{})
  ctx.ExecuteStrategy(arr)
  fmt.Println(arr)
  //设置排序策略-选择策略
  ctx.SetStrategy(&selection{})
  ctx.ExecuteStrategy(arr1)
  fmt.Println(arr1)
}
// 排序策略定义
type SortStrategy interface {
  Sort(arr []int)
}
// 冒泡排序
type bubble struct{}
func (*bubble) Sort(arr []int) {
  fmt.Println("冒泡算法")
  n := len(arr)
  for i := 0; i < n-1; i++ {
    flag := false
    for j := 0; j < n-1-i; j++ {
      if arr[j] > arr[j+1] {
        arr[j], arr[j+1] = arr[j+1], arr[j]
        flag = true
      }
    }
    if !flag {
      break
    }
  }
}
// 选择排序
type selection struct{}
func (*selection) Sort(arr []int) {
  fmt.Println("选择排序")
  size := len(arr)
  for i := 0; i < size-1; i++ {
    minIndex := i
    for j := i + 1; j < size; j++ {
      if arr[j] < arr[minIndex] {
        minIndex = j
      }
    }
    if minIndex != i {
      arr[i], arr[minIndex] = arr[minIndex], arr[i]
    }
  }
}
type Context struct {
  stratety SortStrategy
}
func (ctx *Context) SetStrategy(s SortStrategy) {
  ctx.stratety = s
}
func (ctx *Context) ExecuteStrategy(arr []int) {
  ctx.stratety.Sort(arr)
}

代码如下(示例):main

package main
import _case "design-pattern/trategy/case"
func main() {
  _case.StrategyCase()
}
}


三、工厂模式


case 包

代码如下(示例):简单工厂

package _case
type Product interface {
    GetName() string
}
type ProductA struct {
    name string
}
func (a *ProductA) GetName() string {
    return a.name
}
type ProductB struct {
    name string
}
func (b *ProductB) GetName() string {
    return b.name
}
type ProductC struct {
    name string
}
func (c *ProductC) GetName() string {
    return c.name
}
package _case
import (
    "fmt"
)
type SimpleFactory struct {
}
func (f *SimpleFactory) CreateProduct(productType string) Product {
    switch productType {
    case "A":
        return &ProductA{
            name: "product A",
        }
    case "B":
        return &ProductB{
            name: "product B",
        }
    case "C":
        return &ProductC{
            name: "product C",
        }
    }
    return nil
}
func SimpleFactoryCase() {
    factory := &SimpleFactory{}
    var product Product
    product = factory.CreateProduct("A")
    fmt.Println(product.GetName())
    product = factory.CreateProduct("B")
    fmt.Println(product.GetName())
    product = factory.CreateProduct("C")
    if product != nil {
        fmt.Println(product.GetName())
    }
}

代码如下(示例):简单工厂

package _case
type Product interface {
    GetName() string
}
type ProductA struct {
    name string
}
func (a *ProductA) GetName() string {
    return a.name
}
type ProductB struct {
    name string
}
func (b *ProductB) GetName() string {
    return b.name
}
type ProductC struct {
    name string
}
func (c *ProductC) GetName() string {
    return c.name
}

package _case
import "fmt"
type Factory interface {
    CreateProduct() Product
}
type FactoryA struct {
}
func (f *FactoryA) CreateProduct() Product {
    return &ProductA{
        name: "product A",
    }
}
type FactoryB struct {
}
func (f *FactoryB) CreateProduct() Product {
    return &ProductB{
        name: "product B",
    }
}
type FactoryC struct {
}
func (f *FactoryC) CreateProduct() Product {
    return &ProductC{
        name: "product C",
    }
}
func FactoryMethodCase() {
    var factory Factory
    var product Product
    factory = &FactoryA{}
    product = factory.CreateProduct()
    fmt.Println(product.GetName())
    factory = &FactoryB{}
    product = factory.CreateProduct()
    fmt.Println(product.GetName())
    factory = &FactoryC{}
    product = factory.CreateProduct()
    fmt.Println(product.GetName())
}

代码如下(示例):main

package main
import _case "design-pattern/factory/case"
func main() {
    //_case.SimpleFactoryCase()
    _case.FactoryMethodCase()
}
目录
相关文章
|
16天前
|
设计模式 存储 缓存
「全网最细 + 实战源码案例」设计模式——享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少大量相似对象的内存消耗。通过分离对象的内部状态(可共享、不变)和外部状态(依赖环境、变化),它有效减少了内存使用。适用于存在大量相似对象且需节省内存的场景。模式优点包括节省内存和提高性能,但会增加系统复杂性。实现时需将对象成员变量拆分为内在和外在状态,并通过工厂类管理享元对象。
148 83
|
12天前
|
设计模式 存储 算法
「全网最细 + 实战源码案例」设计模式——命令模式
命令模式(Command Pattern)是一种行为型设计模式,将请求封装成独立对象,从而解耦请求方与接收方。其核心结构包括:Command(命令接口)、ConcreteCommand(具体命令)、Receiver(接收者)和Invoker(调用者)。通过这种方式,命令的执行、撤销、排队等操作更易扩展和灵活。 适用场景: 1. 参数化对象以操作。 2. 操作放入队列或远程执行。 3. 实现回滚功能。 4. 解耦调用者与接收者。 优点: - 遵循单一职责和开闭原则。 - 支持命令组合和延迟执行。 - 可实现撤销、恢复功能。 缺点: - 增加复杂性和类数量。
50 14
「全网最细 + 实战源码案例」设计模式——命令模式
|
12天前
|
设计模式 存储 Java
「全网最细 + 实战源码案例」设计模式——责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,允许将请求沿着处理者链进行发送。每个处理者可以处理请求或将其传递给下一个处理者,从而实现解耦和灵活性。其结构包括抽象处理者(Handler)、具体处理者(ConcreteHandler)和客户端(Client)。适用于不同方式处理不同种类请求、按顺序执行多个处理者、以及运行时改变处理者及其顺序的场景。典型应用包括日志处理、Java Web过滤器、权限认证等。
49 13
「全网最细 + 实战源码案例」设计模式——责任链模式
|
1月前
|
设计模式 缓存 应用服务中间件
「全网最细 + 实战源码案例」设计模式——外观模式
外观模式(Facade Pattern)是一种结构型设计模式,旨在为复杂的子系统提供一个统一且简化的接口。通过封装多个子系统的复杂性,外观模式使外部调用更加简单、易用。例如,在智能家居系统中,外观类可以同时控制空调、灯光和电视的开关,而用户只需发出一个指令即可。
140 69
|
14天前
|
设计模式 算法 开发者
「全网最细 + 实战源码案例」设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列可替换的算法或行为,并将它们封装成独立的类。通过上下文持有策略对象,在运行时动态切换算法,提高代码的可维护性和扩展性。适用于需要动态切换算法、避免条件语句、经常扩展算法或保持算法独立性的场景。优点包括符合开闭原则、运行时切换算法、解耦上下文与策略实现、减少条件判断;缺点是增加类数量和策略切换成本。示例中通过定义抽象策略接口和具体策略类,结合上下文类实现动态算法选择。
50 8
「全网最细 + 实战源码案例」设计模式——策略模式
|
14天前
|
设计模式 SQL 算法
「全网最细 + 实战源码案例」设计模式——模板方法模式
模板方法模式是一种行为型设计模式,定义了算法的骨架并在父类中实现不变部分,将可变部分延迟到子类实现。通过这种方式,它避免了代码重复,提高了复用性和扩展性。具体步骤由抽象类定义,子类实现特定逻辑。适用于框架设计、工作流和相似算法结构的场景。优点包括代码复用和符合开闭原则,缺点是可能违反里氏替换原则且灵活性较低。
60 7
「全网最细 + 实战源码案例」设计模式——模板方法模式
|
26天前
|
设计模式
「全网最细 + 实战源码案例」设计模式——模式扩展(配置工厂)
该设计通过配置文件和反射机制动态选择具体工厂,减少硬编码依赖,提升系统灵活性和扩展性。配置文件解耦、反射创建对象,新增产品族无需修改客户端代码。示例中,`CoffeeFactory`类加载配置文件并使用反射生成咖啡对象,客户端调用时只需指定名称即可获取对应产品实例。
88 40
|
20天前
|
设计模式 Java 开发者
「全网最细 + 实战源码案例」设计模式——适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,通过引入适配器类将一个类的接口转换为客户端期望的另一个接口,使原本因接口不兼容而无法协作的类能够协同工作。适配器模式分为类适配器和对象适配器两种,前者通过多重继承实现,后者通过组合方式实现,更常用。该模式适用于遗留系统改造、接口转换和第三方库集成等场景,能提高代码复用性和灵活性,但也可能增加代码复杂性和性能开销。
68 28
|
16天前
|
设计模式 存储 安全
「全网最细 + 实战源码案例」设计模式——组合模式
组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。它允许客户端以一致的方式对待单个对象和对象集合,简化了复杂结构的处理。组合模式包含三个主要组件:抽象组件(Component)、叶子节点(Leaf)和组合节点(Composite)。通过这种模式,客户端可以统一处理简单元素和复杂元素,而无需关心其内部结构。适用于需要实现树状对象结构或希望以相同方式处理简单和复杂元素的场景。优点包括支持树形结构、透明性和遵循开闭原则;缺点是可能引入不必要的复杂性和过度抽象。
72 22
|
20天前
|
设计模式 缓存 Java
「全网最细 + 实战源码案例」设计模式——代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,通过代理对象控制对目标对象的访问并添加额外功能。它分为静态代理和动态代理,后者包括JDK动态代理和CGLIB动态代理。JDK动态代理基于接口反射生成代理类,而CGLIB通过继承目标类生成子类。代理模式适用于延迟初始化、访问控制、远程服务、日志记录和缓存等场景,优点是职责分离、符合开闭原则和提高安全性,缺点是增加系统复杂性。
73 25