一、策略模式
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
优点:
1、恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码,算法的增加变得容易
2、减少了条件判断语句。
3、可以动态改变算法策略。
缺点
1、必须将算法都暴露给使用者
2、会造成很多的策略类。
解决方案:加上工厂方法模式。
JDK中使用到了策略模式的有
- java.util.Comparator#compare()
- javax.servlet.http.HttpServlet
- javax.servlet.Filter#doFilter()
具体代码。。不小心被我删掉了。。
还是稍微举例下 简单的策略模式+工厂模式
String type="满减";//当前使用的策略方法
List<String> list=null;//比喻为全部算法的父类
switch (type) {
case "满减":
list=new Vector<String>();//满减对应的算法
break;
case "5折":
list=new LinkedList<String>();//5折对应的算法
break;
default:
list=new ArrayList<String>();//正常套路的算法
break;
}
大概就是这种感觉吧。。
二、小知识
在JDK1.7之前switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型,1.7才开始支持符串。
编译成class文件之后,再通过反编译工具得到如下代码:
String type = "满减";
List list = null;
String str1 = type; int i = -1; switch (str1.hashCode())
{
case 900878:
if (str1.equals("满减")) i = 0; break;
case 26883:
if (str1.equals("5折")) i = 1; }
switch (i)
{
case 0:
list = new Vector();
break;
case 1:
list = new LinkedList();
break;
default:
list = new ArrayList();
}
从上面能看出他做了3个步骤
1、生成了对象str1 和 i
2、
case 的值被替换成了hashCode,并且str1还比较了原来的case值(
"满减"是常量)
。
这是因为hash函数在映射的时候可能存在冲突,多个字符串的hash值可能是一样的。
3、在内部又嵌入了一个switch语句(这个地方我不明白他为什么那么写。。直接写到 判断后面不就行了)
大概就是这种感觉。。反正我不管。。多条件我宁愿用switch也不写if esle。
顺便复习下 Vector、ArrayList和LinkedList的差别吧
1、存储方式区别: Vector和ArrayList属于数组方式存储、LinkedList是双向链表方式存储
2、线程安全区别:只有Vector是安全的,所以它的效率就低于其他的
3. 数据操作:随机访问和遍历 ArrayList比LinkedList快,add和remove 则相反