spring4在多态配置上的应用
来源:互联网 发布:最新网络神曲排行榜 编辑:程序博客网 时间:2024/06/05 01:53
多态本质是将公共不变的流程固化在父类中,然后在不同子类中实现变化的部分,父类最终调用子类覆盖的父类方法来完成操作。
典型的以电商常见的商品优惠活动为例,因为可能有很多种不同的优惠方式比如满金额减,满金额打折,满件数打折等等。
如果完全不用面向对象,当然也可以实现
F(){
...
switch(优惠活动类型){
case 1: //满金额打折
F1();
case 2:
F2();
case 3:
F3();
}
...
}
F1(){
p1()
p2()
//特殊计算方法
p3()
p4()
}
F2(){
p1()
p2()
//特殊计算方法
p3()
p4()
}
这种方式简单直观,但是每次增加一种优惠方式,都需要修改主方法F,并增加一个Fn方法
假如Fn方法比较繁琐,同时又会有大量类似代码,这种方式在可维护性上,就很成问题了。
通过面向对象可以比较好的解决这个问题
//优惠活动的基类
class FBase(){
p1(){}
p2(){}
p3(){}
p4(){}
//主方法
main(){
p1()
p2()
r=f()
if(r)
p3()
else
p4()
}
//可被覆盖的实际计算方法
f(){}
}
class F1 extends FBase(){
@Override
f(){
//计算特有方法
}
}
class F2 extends FBase(){
@Override
f(){
//计算特有方法
}
}
F(){
FBase o;
switch(优惠活动类型){
case 1: //满金额打折
o=new F1();
case 2:
o=new F2();
case 3:
o=new F3();
}
//计算优惠活动
o.main()
}
这样拆分后,以后增加一种优惠活动,只要增加一个子类,如果没有特别的,一般只需要实现独特的f方法即可,
万一某些优惠活动很特殊,那么也可以覆盖p1,p2这类方法,或者干脆覆盖main方法,既可以保证充分复用,更保持了足够的灵活性。
当然主方法F这里根据活动类型生成不同的对象,这里比较别扭,完全可以优化一下。
一种方式是自己通过反射来实现
首先,通过额外的配置,配置每种类型对应的类名,然后通过反射来新建对象
F(){
String classname=Config.get(优惠活动类型)
//这里通过语言的反射机制从类名来建立对象,不具体展开
FBase o=createByClassName(classname)
}
而对于spring4,则提供了更简洁的方式,可以让spring直接将同类型的对象全部以数组方式自动注入
@Service
public class HuoDong {
/** 由spring注入各类活动实现类 */
private Map<Integer, FBase> m;
@Autowired
private void setHuoDong(FBase[] a) {
// 通过spring注入同类型
m = new LinkedHashMap<Integer, FBase>();
for (FBase o : a) {
//这里每个子类要通过覆盖父类的getType方法返回他们能处理的活动类型
m.put(o.getType(), o);
}
}
F(){
...
FBase o;=m.get(活动类型);
o.main();
...
}
}
以后增加一种活动,仅仅需要增加一个子类即可,其他一切,都将自动实现!
- spring4在多态配置上的应用
- 一段spring4的配置
- log4j在spring4中的配置
- 在一个tomcat上配置多个相同的应用,或者是用同一个端口上放置多个应用
- 在一个tomcat上配置多个相同的应用,或者是用同一个端口上放置多个应用
- 树状结构在资源映射配置上的应用
- nginx/jetty在Lift-web上的简单应用配置
- Tomcat配置多个Service,多个同名的应用运行在一个tomcat上
- spring4.2的应用事件
- Spring4搭建+REST在Spring上搭建
- spring4+quartz2基本配置及应用
- spring4 下jackson的配置
- spring4 + log4j2+ slf4j的配置
- Spring4 Mybatis3 的开发配置
- Spring4的知识应用总结(四)——Bean的生命周期和注解方式配置
- Spring4 的知识应用总结(一)——基本配置jar包和设置
- Spring4的知识应用总结(二)——Bean配置
- Spring4配置需要的jar包(Spring4.1.2)
- Android Studio引用mipmap中引用.9图片报错
- Cookie和Session的作用和工作原理
- (三)输出函数
- mfc输入输出自定义内容
- python入门基础0
- spring4在多态配置上的应用
- 【Spring实战】----Security4.1.3认证过程源码分析
- Caffe学习系列(12):训练和测试自己的图片
- Android NDK 介绍
- C++ vector容器
- 《第一行代码》学习笔记--Android入门(五、六)
- sqlite中文乱码问题原因分析及解决(utf8和ascii相互转换)
- 解决ubuntu16.04下chrome安装flash插件的问题
- SLAM浅析