设计模式学习——策略模式(Strategy Pattern)

0. 前言

  最近在重构公司的一个项目的时候,在抽取DES加密重复部分代码的时候,突然间想起了策略模式,感觉策略模式好像可以应用上,于是重新学习了下策略模式。注:在DES加密中,有DES和TDES算法,其中又有各种分组模式,如EBC,CBC等。

1. 定义

  引用百度定义:策略模式,定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

2. 应用

  这里的例子参考了《Head First Design Pattern》中的游戏角色装备切换的例子。

  在角色游戏中,每个角色都可以切换武器,这里,对于程序来说,武器是变化的,将武器隔离开,角色只保留着一个武器槽即可。

  如下UML图:

  

  示例程序:

角色基类:

package StrategyPattern;

public abstract class Character {
    private Weapon weapon;
    
    public void setWeapon(Weapon weapon) {
        this.weapon = weapon;
    }
    
    public void fight( )
    {
        weapon.useWeapon();
    }
}

 

具体角色(国王):

package StrategyPattern;

public class King extends Character {
    
    public King( Weapon weapon ) {
        setWeapon(weapon);
    }
    
    public King(  ) {
        setWeapon( new Sword() );
    }
}

 

武器接口:

1 package StrategyPattern;
2 
3 public interface Weapon {
4     void useWeapon();
5 }

具体武器:

1 package StrategyPattern;
2 
3 public class Sword implements Weapon {
4 
5     @Override
6     public void useWeapon() {
7         System.out.println( "Use Sword to fight" );
8     }
9 }
 1 package StrategyPattern;
 2 
 3 public class Knife implements Weapon {
 4 
 5     @Override
 6     public void useWeapon() {
 7         System.out.println( "Use knife to fight" );
 8     }
 9     
10 }

 

 运行实例:

 1 package StrategyPattern.test;
 2 
 3 import org.junit.Test;
 4 
 5 import StrategyPattern.King;
 6 import StrategyPattern.Knife;
 7 
 8 public class TestKing {
 9 
10     @Test
11     public void test() {
12         King king = new King();
13         king.fight();
14         
15         king.setWeapon( new Knife() );
16         king.fight();
17     }
18 
19 }

 

运行结果:

3. 总结

  个人认为,对于策略模式,其实不仅仅局限于OOAP,对于C的一些场景来说也是适合的,例如DES加密算法中,有DES和TDES,这时函数接口原型一样,将DES和TDES算法分别封装在一个函数中,通过定义一个函数指针来实现调用。

原文地址:https://www.cnblogs.com/jabnih/p/4795965.html