【设计模式】第23节:行为型模式之“策略模式”

一、简介

策略模式:定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。

二、适用场景

  • 动态选择算法
  • 多种类似的行为

三、UML类图

请添加图片描述

四、案例

根据成年人、青年、小孩的不同计算不同的价格。

package main

import "fmt"

type PricingStrategy interface {
	CalculatePrice(price float64) float64
}

type ChildrenPricingStrategy struct {
}

func NewChildrenPricingStrategy() *ChildrenPricingStrategy {
	return &ChildrenPricingStrategy{}
}

func (s *ChildrenPricingStrategy) CalculatePrice(price float64) float64 {
	return price * 0.5
}

type AdultPricingStrategy struct {
}

func NewAdultPricingStrategy() *AdultPricingStrategy {
	return &AdultPricingStrategy{}
}

func (s *AdultPricingStrategy) CalculatePrice(price float64) float64 {
	return price
}

type SeniorPricingStrategy struct {
}

func NewSeniorPricingStrategy() *SeniorPricingStrategy {
	return &SeniorPricingStrategy{}
}

func (s *SeniorPricingStrategy) CalculatePrice(price float64) float64 {
	return price * 0.8
}

type PriceCalculator struct {
	Strategy PricingStrategy
}

func NewPriceCalculator(strategy PricingStrategy) *PriceCalculator {
	return &PriceCalculator{Strategy: strategy}
}

func (pc *PriceCalculator) Calculator(price float64) float64 {
	return pc.Strategy.CalculatePrice(price)
}

func main() {
	calculator := NewPriceCalculator(NewChildrenPricingStrategy())
	fmt.Printf("Children price: %v\n", calculator.Calculator(100))

	calculator = NewPriceCalculator(NewAdultPricingStrategy())
	fmt.Printf("Adult price: %v\n", calculator.Calculator(100))

	calculator = NewPriceCalculator(NewSeniorPricingStrategy())
	fmt.Printf("Senior price: %v\n", calculator.Calculator(100))
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值