设计模式-策略模式

策略模式简介

定义:是一种行为型模式,定义了一系列的算法,并且这些算法以不会客户使用为前提可以在运行时进行更改、替换

目的:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护

优点:

多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句,如 if...else 语句、switch...case 语句

策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码

策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的

策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法

策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离

缺点:

客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类

策略模式造成很多的策略类,增加维护难度

实现

角色:

抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现

具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现

环境(Context)类:持有一个策略类的引用,最终给客户端调用

代码:

 1 /**抽象策略**/
 2 public interface Food {
 3     public void make();
 4 }
 5 
 6 /**具体策略1**/
 7 public class Fry implements Food{
 8 
 9     public void make() {
10         // TODO Auto-generated method stub
11         System.out.println("炒是一种以油为主要导热体,将小型原料用中旺火在较短时间内加热成熟、调味成菜的烹饪方式");    
12     }
13 
14 }
15 
16 /**具体策略2**/
17 public class Braise implements Food{
18 
19     public void make() {
20         // TODO Auto-generated method stub
21         System.out.println("蒸是一种把经过调味后的食品原料放在器皿中,利用水汽使其成熟的烹饪方式");
22     }
23 
24 }
25 
26 /**环境**/
27 public class Kitchen {
28      private Food food;
29      
30      public Kitchen(Food food){
31         this.food = food;
32      }
33      
34      public void make(){
35         food.make();
36      }
37 }
38 
39 /**测试方法**/
40 public class App {
41     public static void main( String[] args ){
42         Kitchen kitchen = new Kitchen(new Fry());
43         kitchen.make();
44         System.out.println("--------------------------------------------------");
45         kitchen = new Kitchen(new Braise());
46         kitchen.make();
47     }
48 }
49 
50 测试结果:
51 炒是一种以油为主要导热体,将小型原料用中旺火在较短时间内加热成熟、调味成菜的烹饪方式
52 --------------------------------------------------
53 蒸是一种把经过调味后的食品原料放在器皿中,利用水汽使其成熟的烹饪方式
原文地址:https://www.cnblogs.com/carblack/p/14149665.html