Java设计模式

单例模式

工厂模式

策略模式

概述:策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。

通用接口

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值