创建型模式之Strategy模式

简介:

应用场景

实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。
如编写排序算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。

策略模式体现了两个非常基本的面向对象设计的原则:
1.封装变化的概念。
2.编程中使用接口,而不是对接口的实现

在JDK中的体现

定义一组算法,并把其封装到一个对象中。然后在运行时,可以灵活的使用其中的一个算法。

java.util.Comparator#compare()
javax.servlet.http.HttpServlet
javax.servlet.Filter#doFilter()

参与角色

环境类(Context):用一个ConcreteStrategy对象来配置。
维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。

抽象策略类(Strategy):定义所有支持的算法的公共接口。 
Context使用这个接口来调用某ConcreteStrategy定义的算法。

具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。

编写策略模式的一般步骤:
1.对策略对象定义一个公共接口
2.编写具体策略类,该类实现了上面的接口
3.在使用策略对象的类(即:环境角色)中保存一个对策略对象的引用
4.在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值
5.客户端进行调用

使用策略模式实例

抽象策略类(Strategy):

 

1
2
3
4
5
public  interface  SortStrategy {
     
     public  int [] sort( int [] arr);
 
}

 

具体策略类(ConcreteStrategy):

 

1
2
3
4
5
6
7
8
public  class  InsertionSort  implements  SortStrategy{
 
     @Override
     public  int [] sort( int [] arr) {
         return  arr;
     }
 
}

  

1
2
3
4
5
6
7
8
public  class  SelectionSort  implements  SortStrategy{
 
     @Override
     public  int [] sort( int [] arr) {
         return  arr;
     }
 
}

 

环境类(Context):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  class  Context {
     
     private  SortStrategy strategy;
     
      public  Context(SortStrategy strategy){
             this .strategy = strategy;
         }
      
      
      public  void  muiltySort( int [] arr){
             strategy.sort(arr);
         }
 
}

  

策略模式的缺点

1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类;
2.造成很多的策略类;

 


本文转自邴越博客园博客,原文链接:http://www.cnblogs.com/binyue/p/3526498.html,如需转载请自行联系原作者

相关文章
|
8月前
|
算法 搜索推荐 Java
策略模式 Strategy
策略模式 Strategy
75 0
|
8月前
|
设计模式 Java
设计模式之策略 Strategy
设计模式之策略 Strategy
50 1
|
设计模式 算法 搜索推荐
设计模式—策略(Strategy)模式
设计模式—策略(Strategy)模式
162 1
|
设计模式 算法 Java
Java设计模式-策略模式(Strategy)
Java设计模式-策略模式(Strategy)
|
算法 Java
行为型模式 - 策略模式(Strategy Pattern)
行为型模式 - 策略模式(Strategy Pattern)
|
算法 Java 调度
Delegate 委派模式和代理模式strategy的区别?策略模式如何实现消除多层if else?(下)
Delegate 委派模式和代理模式strategy的区别?策略模式如何实现消除多层if else?(下)
149 0
Delegate 委派模式和代理模式strategy的区别?策略模式如何实现消除多层if else?(下)
|
算法 前端开发 Java
Delegate 委派模式和代理模式strategy的区别?策略模式如何实现消除多层if else?(上)
Delegate 委派模式和代理模式strategy的区别?策略模式如何实现消除多层if else?
258 0
Delegate 委派模式和代理模式strategy的区别?策略模式如何实现消除多层if else?(上)
|
设计模式 缓存 算法
行为型-Strategy
策略模式的原理与实现 策略模式的原理与实现策略模式,英文全称是 Strategy Design Pattern。在 GoF 的《设计模式》一书中,它是这样定义的: Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. 翻译成中文就是:定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端
125 0
|
设计模式 算法 Java
浅谈JAVA设计模式之——策略模式(Strategy)
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
170 0
浅谈JAVA设计模式之——策略模式(Strategy)
|
算法
设计模式七: 策略(Strategy)
简介 策略属于行为型模式的一种,策略模式允许对象的行为或算法在运行时改变,使用不同的算法达成相同的结果或目的. 实现层面上,定义一个抽象的算法接口, 然后根据具体算法的不同定义不同的类去实现该接口, 调用时不同实现的实例可以相互替换. 策略模式适用于多个类只有行为不同,运行时根据上下文决定使用哪种行为; 根据实际情况不同算法可能不同, 或算法的最优实现在未来确定. 意图 定义一系列算法,封装每个算法,并使它们可以互换。
1173 0

热门文章

最新文章