策略模式

策略模式!

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

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

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

首先我们必须写一个策略接口(接口--抽象类可以是接口,类也可以是接口, 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("钢琴声");
    }

}

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

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

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();//你开始弹了...
    }

}

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

我在大叫!!!!!!
碗碎了的声音
钢琴声
*******************************************************
看看,看看,你应用了不同的策略出来的效果就是不一样啊!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值