设计模式:策略模式

1、导学

策略模式用于算法的自由切换和扩展,它是使用较为广泛的设计模式之一。

策略模式实现了算法定义和算法使用的分离,它通过继承和多态的机制实现对算法的使用和管理,是一种简单易用的设计模式。

 

完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该任务。

在很多情况下,实现某个目标的路径不止一条,例如人们外出旅行时,可以选择多种不同的出行方式(旅行出行策略),如可以骑自行车、坐汽车、坐火车、坐飞机,可以根据环境的不同选择不同的策略。。

 

2、策略模式结构

 

1. 模式的结构

策略模式的主要角色如下。

  1. 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
  2. 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
  3. 环境(Context)类:持有一个策略类的引用,最终给客户端调用。


其结构图如图 1 所示。
 

策略模式的结构图

 

2. 模式的实现

策略模式的实现代码如下:

 

package strategy;
public class StrategyPattern
{
    public static void main(String[] args)
    {
        Context c=new Context();
        Strategy s=new ConcreteStrategyA();
        c.setStrategy(s);
        c.strategyMethod();
        System.out.println("-----------------");
        s=new ConcreteStrategyB();
        c.setStrategy(s);
        c.strategyMethod();
    }
}
//抽象策略类
interface Strategy
{   
    public void strategyMethod();    //策略方法
}
//具体策略类A
class ConcreteStrategyA implements Strategy
{
    public void strategyMethod()
    {
        System.out.println("具体策略A的策略方法被访问!");
    }
}
//具体策略类B
class ConcreteStrategyB implements Strategy
{
  public void strategyMethod()
  {
      System.out.println("具体策略B的策略方法被访问!");
  }
}
//环境类
class Context
{
    private Strategy strategy;
    public Strategy getStrategy()
    {
        return strategy;
    }
    public void setStrategy(Strategy strategy)
    {
        this.strategy=strategy;
    }
    public void strategyMethod()
    {
        strategy.strategyMethod();
    }
}

策略模式的应用实例

 

策略模式实例:之排序策略:

某系统提供了一个用于对数组数据进行操作的类,该类封装了对数组的常见的操作,如对数组进行排序等。

多种排序算法供用户选择: 冒泡排序,或者选择插入排序,或者选择排序,可以更换排序算法,也能灵活地增加新的排序算法。

实例类图:

 

实例代码:

1)抽象策略类Sort (抽象排序类)

public interface Sort{

  public abstract int[] sort(int arr[]);

}

 

2) 冒泡排序-具体策略类BubbleSort

public class BubbleSort implements Sort{

   public int[] sort (int arr[]){

     System.ouut.println("冒泡排序");

  }

}

 

3) 具体策略类 - SelectionSort 选择排序

public class SelectionSort implements Sort{

   public int[] sort (int arr[]){

     System.ouut.println("选择排序");

  }

}

4) 具体策略类 - InsertionSort 插入排序

public class SelectionSort implements Sort{

   public int[] sort (int arr[]){

     System.ouut.println("插入排序");

  }

}

 

5) 环境类

public class ArrayHandler {

   private Sort sortObj;

  public int[] sort(int arr[]){

    sortObj.sort(arr);

   return arr;

  }

 

 public void setSortObj(Sort sortObj){

     this.sortObj = sortObj;

  }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值