HeadFirst学习之策略模式

      对于一个java程序员来说,设计模式的学习必不可少,我们需要编写更加优美的代码。虽然对于我来说设计模式现阶段理解起来有一些吃力,但是程序员就该有一颗不断学习的心。下面写一下自己对于策略模式的理解。
      百度百科上对策略模式的定义是:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
      通俗点的理解就是现在有一个类,其中某个功能有很多种情况需要考虑,每种情况则对应不同的算法(执行不同的方法),这时我们可以使用策略模式,把所有的算法封装起来供该类的此功能使用,我们可以在这些算法之间自由切换,这个切换的过程是和该类解耦,可以在运行过程中进行,不需要改写代码。
      下面举一个现实生活中的例子:我们想吃水果时要去超市买,超市会不定期的搞一些促销活动。例如10.1期间,苹果降价10%;圣诞节苹果又提价15%;元旦来了,苹果又降价8%。这时我们可以在Apple类中通过编码来实现:

if(date == "10.1"){
    price = price * 0.9;
}else if(date == "12.25"){
    price = price * 1.15;
}else if(date == "1.1"){
    price = price * 0.92;
}

      这样显然是不好的,因为当出现某种原因,10.1时苹果的价格要进行大幅度下调,那么就需要修改苹果类中的关于折扣部分的代码。可能只有一个苹果类,我们更改代码的工作量还不是很大,但是如果再加一个香蕉类、西瓜类……毫无疑问,这样对工作量是一个极大的考验,而且还面临着不同水果折扣不同的情境。所以我们可以将所有的水果共同继承一个父类Fruit,父类中有关于显示折扣的方法,同时父类中也包含设置折扣的方法。在这里所说的折扣,可以联想成我们上文所说的算法,就像10.1来了,苹果对应怎样的折扣,香蕉对应怎样的折扣……我们要做的就是把每一种折扣封装起来,使用一个统一的方法去修改,这里就要用到面向接口编程的思想了。下面先贴上Fruit类的代码:

public abstract class Fruit {

    public Discount discount; //折扣

    //设置折扣信息
    public void setDiscount(Discount discount){
        this.discount = discount;

    //这里需要子类重写该方法主要是为了得到子类相关信息
    public abstract void showDiscount();

}

      Fruit类持有一个Discount接口的变量,同时有一个set方法用来设置折扣,一个子类需重写的方法来提供本类信息及折扣详情。下面是Fruit两个子类的代码:

//Apple类
public class Apple extends Fruit{

    public void showDiscount(){
        System.out.println("我是apple");
        this.discount.showDiscount();
    }

}
//Banana类
public class Banana extends Fruit{

    public void showDiscount(){
        System.out.println("我是banana");
        this.discount.showDiscount();
    }

}

      上面Fruti类持有的Discount变量为一个接口,可以根据不同的情况赋予不同的折扣,下面是Discount接口和它的两个实现类的代码:

//Disconut接口
public interface Discount{

    public void showDiscount();

}
//Disconut10类
public class Discount10 implements Discount{
    @Override
    public void showDiscount() {
        System.out.println("优惠详情是:降价10%");
    }   
}
//Disconut15类
public class Discount15 implements Discount{
    @Override
    public void showDiscount() {
        System.out.println("优惠详情是:降价15%");
    }
}

      这样,我们就可以为不同的水果设置不同的折扣,而且不需要对Fruit子类内部代码进行修改,保证了代码的整洁,以下是Supermarket类用来测试:

public class Supermarket {

    public static void main(String[] args) {

        Fruit apple = new Apple();
        Fruit banana = new Banana();

        apple.setDiscount(new Discount10());
        apple.showDiscount();
        banana.setDiscount(new Discount15());
        banana.showDiscount();
    }

}
//运行结果为:
我是apple
优惠详情是:降价10%
我是banana
优惠详情是:降价10%

      这样就达到了我们想要的目的,根据不同情况来设置不同的算法,执行出不同的结果。说完上面的例子,再把策略模式的定义贴一下:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。结合例子,使用策略模式定义了N中折扣方案,对应每种水果,我都可以在设置折扣方案,并且独立于水果,我可以随意变化折扣方案,不需要修改水果部分代码,我理解就是水果和折扣的解耦。
      以上是我看完HeadFirst第一章对于策略模式的理解,若有不当之处欢迎指出,各位看官辛苦啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值