单例模式
工厂模式
策略模式
概述:策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。
通用接口
package com.joyreach.download.strategy.apkMarket;
public interface IApkMarketStrategy {
String downloadApk();
}
策略1:
package com.joyreach.download.strategy.apkMarket.impl;
import com.joyreach.download.strategy.apkMarket.IApkMarketStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component("GooglePlay")
public class GooglePlayDownloadImpl implements IApkMarketStrategy {
private static final Logger logger = LoggerFactory.getLogger(GooglePlayDownloadImpl.class);
@Override
public String downloadApk() {
logger.debug("GooglePlay Download Begin!");
logger.debug("GooglePlay Download End!");
return "GooglePlay";
}
}
策略2:
package com.joyreach.download.strategy.apkMarket.impl;
import com.joyreach.download.strategy.apkMarket.IApkMarketStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component("HuaWei")
public class HuaWeiDownloadImpl implements IApkMarketStrategy {
private static final Logger logger = LoggerFactory.getLogger(XiaoMiDownloadImpl.class);
@Override
public String downloadApk() {
logger.debug("HuaWei Download Begin!");
logger.debug("HuaWei Download End!");
return "HuaWei";
}
}
策略3:
package com.joyreach.download.strategy.apkMarket.impl;
import com.joyreach.download.strategy.apkMarket.IApkMarketStrategy;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component("XiaoMi")
public class XiaoMiDownloadImpl implements IApkMarketStrategy {
private static final Logger logger = LoggerFactory.getLogger(XiaoMiDownloadImpl.class);
@Override
public String downloadApk() {
logger.debug("XiaoMi Download Begin!");
String url = "http://app.mi.com/details?id=com.xiaomi.o2o";
try {
Document document = Jsoup.connect(url).timeout(2000).get();
Elements elements = document.getElementsByClass("app-info-down");
String downloadUrl = elements.first().getElementsByTag("a").first().attr("href");
logger.debug("准备下载");
return "http://app.mi.com"+downloadUrl;
} catch (IOException e) {
logger.debug("XiaoMi Download End!");
e.printStackTrace();
return "异常";
}
}
}
环境类(Context):用来操作策略的上下文环境
package com.joyreach.download.strategy;
/**
* 策略管理器
* @author
*
*/
import com.joyreach.download.strategy.apkMarket.IApkMarketStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
public class StrategyContext {
private final Map<String, IApkMarketStrategy> strategyMap = new ConcurrentHashMap<String, IApkMarketStrategy>();
/**
* 注入所有实现了IStrategy接口的Bean
* @param strategyMap
*/
@Autowired
public void StrategyInterface(Map<String, IApkMarketStrategy> strategyMap) {
this.strategyMap.clear();
strategyMap.forEach((k, v)-> this.strategyMap.put(k, v));
}
/**
* 针对不同的应用市场下载apk
* @param apkMarket 应用市场
* @return 下载
*/
public String chooseMarket(String apkMarket) {
if(!StringUtils.isEmpty(apkMarket)){
String apk = strategyMap.get(apkMarket).downloadApk();
return apk;
}
return null;
}
}
调用示例:
public String chooseMarket(String str){
return strategyContext.chooseMarket(str);
}
参考:http://c.biancheng.net/view/1378.html