设计模式--------策略模式

设计模式--------策略模式

设计模式七大原则详解

目录

设计模式--------策略模式

1、什么是策略模式

2、策略模式结构图

3、适用的场景

4、优点与缺点

5、模式的实例演示


1、什么是策略模式

什么是策略模式呢?他就是定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

打个比方,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。

  再比如我们去逛商场,商场现在正在搞活动,有打折的、有满减的、有返利的等等,其实不管商场如何进行促销,说到底都是一些算法,这些算法本身只是一种策略,并且这些算法是随时都可能互相替换的,比如针对同一件商品,今天打八折、明天满100减30,这些策略间是可以互换的。

2、策略模式结构图

  • 策略模式共分为三种角色:
    • Context(上下文环境):持有抽象策略类,调用策略方法。
    • Strategy(抽象策略类):声明策略方法。
    • Concrete Strategy(具体策略类):实现策略方法。
  • Context持有Stategy的引用,完成对ConcreteStrategy中策略方法的调用。

3、适用的场景

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2、一个系统需要动态地在几种算法中选择一种。

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

4、优点与缺点

       优点: (1)算法可以自由切换。

                   (2)避免使用多重条件判断。

                   (3)扩展性良好。

       缺点:(1)策略类会增多。

                  (2)所有策略类都需要对外暴露。

5、模式的实例演示

 (1) 创建抽象策略模式:

package 行为型.策略;

/**
 * 策略接口
 */
public interface MoneyStrategy {
      
     //计算活动后的总额
    double countMoney(double totalMoney);

}

(2)抽象接口实现类(算法的实现)

package 行为型.策略;

/**
 * 八折活动
 */
public class EigthConut implements MoneyStrategy {

    @Override
    public double countMoney(double totalMoney) {
        return totalMoney * 0.8;
    }
}
package 行为型.策略;

/**
 * 满600减50
 */
public class FullCount implements MoneyStrategy {
    @Override
    public double countMoney(double totalMoney) {
        return totalMoney > 600 ? totalMoney - 50 : totalMoney;
    }
}

(3)环境上下文,通过他进行算法的切换:

package 行为型.策略;

/**
 * 上下问环境
 */
public class DisCount {

    private MoneyStrategy strategy;
  
    public DisCount(MoneyStrategy strategy){
        this.strategy = strategy;
    }
    public double getConut(double totalMoney){
        return strategy.countMoney(totalMoney);
    }

}

(4)测试类:

package 行为型.策略;

/**
 * 策略模式测试类
 */
public class Main {
    public static void main(String args[]){
        DisCount disCount = new DisCount(new EigthConut());
        System.out.println(disCount.getConut(600));
        DisCount disCount1 = new DisCount(new FullCount());
        System.out.println(disCount1.getConut(800));
    }
}

结果:480.0
           750.0

发布了78 篇原创文章 · 获赞 53 · 访问量 8132

猜你喜欢

转载自blog.csdn.net/qqq3117004957/article/details/105454978
今日推荐