美文网首页
策略模式

策略模式

作者: AcceptedLc | 来源:发表于2017-03-18 13:57 被阅读14次

理论

定义

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),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。


相关文章

网友评论

      本文标题:策略模式

      本文链接:https://www.haomeiwen.com/subject/ryljnttx.html