策略模式

来源:互联网 发布:高达seed 知乎 编辑:程序博客网 时间:2024/06/09 06:44

策略模式!
策略是个什么玩意儿?就是做事的方式呗。

理解设计模式,千万万千不要把它想成神啊!OMG!

对于办一件事情,你可以有不同的“策略”,而做事情的主体(比如你)可以随时调用不同的策略来做事情!这里有个关键点,就是做事情的主体在这个过程中是不变的。你还是你,比如让你做一件事情:制造点声音。

这个任务可以有很多策略的哦!你可以大喊一声;你可以摔个碗什么的;你可以弹个钢琴什么的....,反正又没有规定你“怎么”制造声音,其中的“怎么”就是策略。很简单吧,嘻嘻!

就拿让你“制造点声音”这个例子写点代码吧:

首先我们必须写一个策略接口(接口--抽象类可以是接口,类也可以是接口, interface关键字说明的更是接口了),我们这里使用抽象类(当然,你也可以使用接口):

这是一个总的---抽象---出来的策略接口
package st;

public abstract class Strategy {
    public abstract void MakeSound(); //制造点声音,呵呵
}

下面是几个具体的策略:

策略一:你大叫一声:

package st;

public class Strategy1 extends Strategy {

    @Override
    public void MakeSound() {
        // TODO Auto-generated method stub
        System.out.println("我在大叫!!!!!!");
    }

}

策略二:摔个碗吧:

package st;

public class Strategy2 extends Strategy {

    @Override
    public void MakeSound() {
        // TODO Auto-generated method stub
        System.out.println("光叽!!碗碎了!!你听到声音了吗?");
    }

}

第三个策略:弹钢琴

package st;

public class Strategy3 extends Strategy {

    @Override
    public void MakeSound() {
        // TODO Auto-generated method stub
        System.out.println("12345678多优美的音乐啊!!");
    }

}

好了,现在我们有了三个“制造声音的策略”,当然你可以再增加无数的策略,只要你觉得有必要的话。下面就得看看我们应用不同的策略来办事的代码了,毕竟策略是用来办事的呀:
在继续之前,先总结一下现在我们有的是什么:不错,我们有一个抽象的策略,以及三个具体的策略!抽象的策略只是个概念,它什么事情也做不了,但是它却给我们带来了巨大的灵活性,你不欣,走着瞧吧。还有,放眼望去好多策略呀!你能用,我也能用!多灵活呀!

你先用吧,先做你一个“你”:

package st;

public class You {
    private Strategy s; //你的心里有一个策略(声明为抽象的)
    
    public You(Strategy s){ //毕竟只有具体的策略才能办事,所以在构造函数里你得定一个你的策略
        this.s = s; 
    }
    
    public void setStrategy(Strategy s){ //毕竟你是个大活人,很可能策略会改变哦,所以增加这个方法
        this.s = s;
    }
    
    public void performMakeSound(){ //你只要一调你的这个方法,你就应用你设定的策略来做事啦!看看吧,光环全让//它给占了!!
        s.MakeSound();
    }
}

下面是生出一个你来,让你来办事的代码啦,看看我写的注释吧,应该有点帮助吧:

package st;

public class StTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        You you  = new You(new Strategy1()); //你一开始选择了大喊大叫这个制造声音的策略
        you.performMakeSound();//然后你就大喊大叫了
        
        //后来你想到了摔碗这个方式更有意思,所以你就改变了自己的“制造声音”的策略:
        you.setStrategy(new Strategy2());
        you.performMakeSound(); //然后你就摔了一个碗
        
        //后来你会弹钢琴了,所以你又想改变自己的“制造声音”的策略:
        you.setStrategy(new Strategy3());
        you.performMakeSound();//你开始弹了...
    }

}

最终代码运行的结果:*************************

我在大叫!!!!!!
光叽!!玩碎了!!你听到声音了吗?
12345678多优美的音乐啊!!
*******************************************************
看看,看看,你应用了不同的策略出来的效果就是不一样啊!

我们究竟做了什么:其实我们在封装算法!这些算法有相同的接口,这样调用策略的主体就可以很灵活地来调整自己 的“策略“了。其实帮我们的还是我们的老朋友————抽象!

今天不忙,随便写了点...

原创粉丝点击