设计模式-策略模式
策略模式简介
定义:是一种行为型模式,定义了一系列的算法,并且这些算法以不会客户使用为前提可以在运行时进行更改、替换
目的:在有多种算法相似的情况下,使用 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 蒸是一种把经过调味后的食品原料放在器皿中,利用水汽使其成熟的烹饪方式