一种思路:策略模式 + 反射工厂,很好的实现了开闭原则(1)

import org.springframework.ui.Model;

/**

* @author : David.liu

* @description : 得到指定广告页面

* @creat :2019-05-26-22:02

*/

public interface GetPointAdvertisePageStrategey {

/**

* 得到指定的页面

* @param itemRecommendParam

* @param model

* @return

*/

String getAdvertisePage(Model model);

}

Ppd实现接口代码:PdpAdvertisePageStrategey.java

import org.springframework.stereotype.Component;

import org.springframework.ui.Model;

/**

* @author : David.liu

* @description : 得到pdp广告页面

* @creat :2019-05-26-22:05

*/

@Component

public class PdpAdvertisePageStrategey implements  GetPointAdvertisePageStrategey{

/**

* 得到指定的页面

* @param itemRecommendParam

* @param model

* @return

*/

@Override

public String getAdvertisePage() {

return “pdp-advertise.jsp”;

}

}

Plp实现接口代码:PlpAdvertisePageStrategey.java

import org.springframework.stereotype.Component;

import org.springframework.ui.Model;

/**

* @author : David.liu

* @description : 得到指定的plp广告页面

* @creat :2019-05-26-22:07

*/

@Component

public class PlpAdvertisePageStrategey implements GetPointAdvertisePageStrategey {

/**

* 得到指定的plp广告页面

* @param itemRecommendParam

* @param model

* @return

*/

@Override

public String getAdvertisePage() {

return “plp-advertise.jsp”;

}

}

购物车实现接口代码 ShopingCartAdvertisePageStrategey.java

import org.springframework.stereotype.Component;

import org.springframework.ui.Model;

/**

* @author : David.liu

* @description : 得到购物车广告页面

* @creat :2019-05-26-22:10

*/

@Component

public class ShopingCartAdvertisePageStrategey implements  GetPointAdvertisePageStrategey {

/**

* 得到指定的购物车页面

* @param model

* @return

*/

@Override

public String getAdvertisePage() {

return “shoppingcart-advertise.jsp”;

}

}

结算实现接口代码:CheckoutAdvertisePageStrategey.java

import org.springframework.stereotype.Component;

import org.springframework.ui.Model;

/**

* @author : David.liu

* @description : 得到结算页面广告页面

* @creat :2019-05-26-22:12

*/

@Component

public class CheckoutAdvertisePageStrategey implements  GetPointAdvertisePageStrategey {

/**

* 得到指定的结算页面

* @param itemRecommendParam

* @param model

* @return

*/

@Override

public String getAdvertisePage() {

return “checkout-advertise.jsp”;

}

}

生产广告页面。简单工厂类 GetPointAdvertisePageReflectFactory.java,案例未使用,但代码贴出来了,供读者对比两个的差异,感受一下,开闭原则,对比一下,简单工厂和反射工厂的不同。

思考角度,如果需求在加一个策略类,2个、3个?那么你就感受到了

import com.feilong.core.Validator;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import java.util.HashMap;

import java.util.Map;

/**

* @author : David.liu

* @description : 生产广告页面简单工厂

* @creat :2019-05-26-22:14

*/

@Component

public class GetPointAdvertisePageSimpleFactory {

public static final String PDP_ITEM_ADVERTISE = “PDP_ITEM_ADVERTISE”;

public static final String PLP_ITEM_ADVERTISE = “PLP_ITEM_ADVERTISE”;

public static final String CHECKOUT_ITEM_ADVERTISE = “CHECKOUT_ITEM_ADVERTISE”;

public static final String SHOPPINGCART_ITEM_ADVERTISE = “SHOPPINGCART_ITEM_ADVERTISE”;

private static Map<String, GetPointAdvertisePageStrategey> recommendStrategyMap = new HashMap<>();

@Autowired

private CheckoutAdvertisePageStrategey checkoutAdvertisePageStrategey;

@Autowired

private PdpAdvertisePageStrategey pdpAdvertisePageStrategey;

@Autowired

private PlpAdvertisePageStrategey plpAdvertisePageStrategey;

@Autowired

private ShopingCartAdvertisePageStrategey shopingCartAdvertisePageStrategey;

/** 初始化所有的策略类 */

protected void init(){

recommendStrategyMap.put(PDP_ITEM_ADVERTISE, pdpAdvertisePageStrategey);

recommendStrategyMap.put(PLP_ITEM_ADVERTISE,plpAdvertisePageStrategey );

recommendStrategyMap.put(CHECKOUT_ITEM_ADVERTISE, checkoutAdvertisePageStrategey);

recommendStrategyMap.put(SHOPPINGCART_ITEM_ADVERTISE,shopingCartAdvertisePageStrategey );

}

/** 根据pageType 得到指定的处理类 */

public GetPointAdvertisePageStrategey getStrategey(String pageType) {

if(Validator.isNullOrEmpty(recommendStrategyMap)){

init();

}

return recommendStrategyMap.get(pageType);

}

}

生产广告页面。反射工厂类 GetPointAdvertisePageReflectFactory.java

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.config.AutowireCapableBeanFactory;

import org.springframework.context.ApplicationContext;

import org.springframework.stereotype.Component;

/**

* @author : David.liu

* @description : 生产广告页面反射工厂

* @creat :2019-05-26-22:15

*/

@Component

public class GetPointAdvertisePageReflectFactory {

@Autowired

private ApplicationContext context;

private static final Logger LOGGER = LoggerFactory.getLogger(GetPointAdvertisePageReflectFactory.class);

// 通过配置文件名:filePathName   和 文件中的key 得到指定的类

public GetPointAdvertisePageStrategey getAdvertisePageStrategey(String filePathName, String key){

GetPointAdvertisePageStrategey getPointAdvertisePageStrategey = null;

String classPath = null;

try {

classPath = PropertyUtil.get(filePathName,key);

if(Validator.isNullOrEmpty(classPath)) return null;

//通过反射创建对象

Class<?> handler = Class.forName(classPath);

//这里必须强行纳入spring管理,否则在得到的具体实现类中,如果有通过@Autowired注入的bean,将会报注入失败

getPointAdvertisePageStrategey = (GetPointAdvertisePageStrategey) context.getAutowireCapableBeanFactory().createBean(handler, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);

} catch (Exception e) {

LOGGER.error(“Failed to reflect the corresponding object through the specified path,filePath:{},key:{}”,filePathName,key);

return null;

}

return getPointAdvertisePageStrategey;

}

}

文件读取工具类: PropertyUtil.java

import com.feilong.core.Validator;

import java.io.IOException;

import java.io.InputStream;

import java.util.HashMap;

import java.util.Map;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-YemRf4T2-1715188339606)]

[外链图片转存中…(img-TW4lpwit-1715188339607)]

[外链图片转存中…(img-X0Iw9pUQ-1715188339607)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值