zoukankan      html  css  js  c++  java
  • 设计模式学习——策略模式(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算法分别封装在一个函数中,通过定义一个函数指针来实现调用。

  • 相关阅读:
    《第一行代码》阅读笔记(三十一)——多线程
    《第一行代码》阅读笔记(三十)——MVP(补充)
    《第一行代码》阅读笔记(二十九)——网络框架 OkHttp+Retrofit+Rxjava
    《第一行代码》阅读笔记(二十八)——网络技术(OkHttp+JSON/GSON)
    sql server优化查询速度(子查询)
    sql server 查询字段是否为数字
    Git操作汇总
    解决github下载过慢方式
    InnoDB存储引擎简介
    MySQL主从复制详解
  • 原文地址:https://www.cnblogs.com/jabnih/p/4795965.html
Copyright © 2011-2022 走看看