大话设计模式读后感之策略模式

一、策略模式

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

优点:

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 则相反



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值