策略模式其实就是对各种行为算法的包装,各种不同的行为的算法的分离。属于对象的行为模式。
策略模式类图,比较简单,没有自己画,是窃取别人的。
策略模式角色划分
Strategy 策略接口或者(抽象策略类),定义策略执行接口
ConcreteStrategy 具体策略类
Context 上下文类,持有具体策略类的实例,并负责调用相关的算法
Demo:使用场景,加入有一个简单的爬虫系统,每个网站都会有单独的类或者接口服务爬取相关的服务。
比如,爬取招标网的信息,爬取财经网的信息等等。
//爬取
public interface Crawler {
public void crawling();
}
//财经网爬取内容
public class CaiJingInfoCrawling implements Crawler{
@Override
public void crawling() {
// TODO Auto-generated method stub
//财经网业务逻辑
}
}
//招标网爬取
public class ZhaoBiaoCrawling implements Crawler{
@Override
public void crawling() {
// TODO Auto-generated method stub
}
}
//爬虫处理类
public class CrawlingHandler {
private Crawler crawler;
public CrawlingHandler(Crawler crawler) {
super();
this.crawler = crawler;
}
public void crawling() {
System.out.println("爬取");
crawler.crawling();
}
}
package com.test2;
public class CrawlingClient {
//客户端需要提前知道这个爬取的网站,也就是已经提前知道了要使用哪个具体的类
public static void main(String[] args) {
Crawler crawler = new CaiJingInfoCrawling();
CrawlingHandler clh = new CrawlingHandler(crawler);
//开始爬取内容
clh.crawling();
}
}
策略模式优点:可以在不改变原来的代码基础上灵活的增加新算法类,遵循设计模式中的开闭原则。什么事开闭原则,这里简单介绍一下,就是一个类或者服务可以对其进行扩展也就是开,对其修改不可以,也就是闭,这就是设计模式中的开闭原则。
缺点:就是客户端首先要知道这个是要调用的是什么,自己决定要调用哪个类,哪个接口等服务。