策略模式

理论

定义

Define a family of algorithms,encapsulate each one,and make them interchangeable.(定义一组算法,将每个算法封装起来,并且使他们之间可以互换)

类图

StrategyPattern.jpg
  • Context的作用是承上启下,屏蔽高层模块对策略,算法的直接访问,封装可能存在的变化
  • Strategy是策略的抽象,每一个具体的策略都需要具有按照Strategy的规范实现
  • ConcreteStrategy各个策略的具体实现

实战

场景
想要做一个基金的价格提醒功能,在基金的净值从同类产品的均价之上下降到同类产品的均价之下后,发一个短信提示

为了完成上述功能,则势必需要写一个爬虫,对基金每日的净值进行抓取,为了保证每天的数据都可以正常的获取到,则需要准备多个爬虫脚本对不同的数据源进行抓取,每种数据源的爬虫可以视作一个策略

Strategy

//定义如下的爬虫接口
type fundCrawler interface {
    check(fundCode string) (netWorth float64, err error)
    crawler(fundCode string, startFrom time.Time) (netWorths []FundNetWorth, err error)
}

ConcreteStrategy

为了提供一个更加稳健的服务,选择从天天基金,京东金融,蚂蚁金服三个平台获取数据

这里只通过一个爬虫来说明具体的策略的实现

type tiantianCrawler struct {
    baseURL string
}

func (tiantianCrawler tiantianCrawler) crawler(fundCode string, startFrom time.Time) (netWorths []FundNetWorth, err error) {
    netWorths, err = []FundNetWorth{FundNetWorth{time.Now(), 1.423}}, nil
    return
}

func (tiantianCrawler tiantianCrawler) check(fundCode string) (netWorth float64, err error) {
    netWorth, err = 1.989, nil
    return
}

Context

//CrawlerContext is crawler Context
type CrawlerContext struct {
    worker fundCrawler
}

//CreateCrawlerContext create a context
func CreateCrawlerContext(concreteCrawler fundCrawler) (context CrawlerContext, err error) {
    context, err = CrawlerContext{worker: concreteCrawler}, nil
    return
}

//Operate triger crawler
func (context CrawlerContext) Operate(fundCode string, startFrom time.Time) (netWorths []FundNetWorth, err error) {
    netWorths, err = context.worker.crawler(fundCode, startFrom)
    return
}

上层使用

func useDemo() {
    tiantian := tiantianCrawler{baseURL: "http://fund.eastmoney.com"}
    context, err := CreateCrawlerContext(tiantian)
    if err != nil {
        return
    }
    context.Operate("161725", time.Now())
}

存在的问题

  • 所有的策略类都对需要对外暴露违反了迪米特法则

迪米特法则(Law of Demeter)又叫作最少知道原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1 场景问题# 1.1 报价管理## 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的...
    七寸知架构阅读 5,285评论 9 61
  • 1 场景问题 1.1 报价管理 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的客户要...
    4e70992f13e7阅读 3,253评论 2 16
  • 1.概述 demo地址,欢迎star 例子1: 商场产品销售:可以正常价格售出,可以打折形式售出,也可以通过积分的...
    barry阅读 894评论 0 1
  • 本文仅仅为入门,高手勿喷。 实际工作中,我们总会遇到类似如下的需求:某支付系统接入以下几种商户进行充值:易宝网易,...
    JarvanMo阅读 14,422评论 14 26
  • 1.问题例1:一个菜单功能能够根据用户的“皮肤”首选项来决定是否采用水平的还是垂直的排列形式。同事可以灵活增加菜单...
    小飞猪阅读 424评论 0 0

友情链接更多精彩内容