策略模式浅谈

其实策略模式,从字面意思上理解,类似于我想达到某一种效果时,不用去煞费苦心的再去想方法,而是已经做好的方法只要去调用就可以了

那么体现到java程序设计里,也可以这么理解,如果过程是随着参数的变化而变化的,这个时候就可以用策略模式

好像有点类似于开车,想要车跑的速度不一样,只需要轻轻的换下档位就O了,每个档位对应的速度范围都是设计好的

从下面的这个小小的遍历文件的例子来看效果:

现在我想遍历E盘下的abc文件夹下的所有文件,那么遍历文件的代码是不变的,遍历到文件以后,怎么处理是变化的,这也刚好响应了程序设计的基本原则,将变化的代码和不变的代码分离开
先看如下代码:

import java.io.*;
public class Test{
    public static void walkDir(File file){
        File[] files = file.listFiles();
        for(File ff : files){
            if(ff.isDirectory()){
                    walkDir(ff);//递归调用,会去开辟新空间
            }
            System.out.println(ff.getAbsolutePath());
            //这里将得到遍历到的文件的绝对路径
        }
    }
    public static void main(String[] args){
        walkDir(new File("E:/abc"));
    }
}

上面代码遍历到文件后,输出了文件的绝对路径

那么现在假如我不想输出文件的绝对路径,而是想做其它的处理,这里就得把代码换掉,比如说想把某个文件删除,或者是改名字,当然这里只是针对这个例子做些简单的改动,貌似看起来不是太麻烦,那么假如是这里要改动的是上百、上千行的代码呢,就会显得十分的不方便

人家说杀死一个程序猿,不需要干别的,改两次需求就可以了……………

所以这时候策略模式就可以派上用场了,看下面的代码:
在外面定义一个接口:

interface Process{
    public void process(File file);
}
public class Test{
    public static void walkDir(Process p,File file){
        File[] files = file.listFiles();
        for(File ff : files){
            if(ff.isDirectory()){
                    walkDir(p,ff);
            }
            //这里就把遍历文件的代码与处理文件的代码分离开了
            p.process(ff);
        }
    }
    public static void main(String[] args){
        Process p1 = new Process(){
            public void process(File file){
                System.out.println(ff.getAbsolutePath());
                //p1 处理器,只是简单的输出文件的绝对路径;
            }
        };
        Process p2 = new Process(){
            public void process(File file){
                private count = 0;
                String path = file.getAbsolutePath();
                int index = path.lastIndexOf("\\");
                String str = path.substring(0,index);
                file.renameTo(new File(str+ "/" + count));
                count++;
                //p2处理器,将遍历到的文件名字改成相关数字
            }
        };
        //如果想用p2,只需要将下面的第一个参数改成p2,就可以了
        walkDir(p1,new File("E:/abc"));
    }
}

那么这里要提一点,为什么要把Process设置为接口呢?
我们知道接口具有可以达到完全解耦的目的,降低了耦合性,那么现在我里面写好的是两种方法,假如客户端程序猿想去自己定义一个方法,这个时候,接口的作用就体现出来了,它只要去实现这个接口,重写里面的process()方法,根据他自己的需要再去写方法,而我只是把这个框架提供给他,他可以自由发挥
这是这个设计模式的简单应用举例,就先这样吧,后续再完善……………..

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值