设计模式之美—策略模式

策略模式

什么是策略模式

  策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化

策略模式是对算法的包装,是把使用算法的责任和算法本身分开。策略模式通常是把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。

例如下象棋时,炮的前进策略和马、兵的策略是不一样的,算法是有区别的。

我们开始实战,为了说明问题,我们以上图为例做一个超级简单的象棋(简单到没法玩象棋,嘿嘿),假设现在象棋只有炮、兵、将,代码如下。

 1 public class Chess {
 2
 3     /**
 4      * 兵前进算法
 5      * @param a 原位
 6      * @param b 目标为
 7      */
 8     public void soldierGoAhead(int a, int b){
 9         System.out.println("兵"+a+"进"+b);
10     }
11
12     /**
13      * 炮前进算法
14      * @param a 原位
15      * @param b 目标为
16      */
17     public void gunGoAhead(int a, int b){
18         System.out.println("炮"+a+"进"+b);
19     }
20 }

这样写可以吗?如果随着我们的算法不断增加,如马的行走规则,象的行走规则等等,那么这个象棋类就得不断的改,那岂不是在作死。

我们开始用策略模式来改写代码。

抽象的策略接口:

 1 public interface Strategy {
 2
 3     /**
 4      * 前进策略
 5      * @param a 原位
 6      * @param b  目标位
 7      */
 8     public void goAhead(int a, int b);
 9
10     /**
11      * 平策略
12      * @param a 原位
13      * @param b  目标位
14      */
15     public void straight(int a, int b);
16 }

实现炮的行走策略:

 1 public class GunStrategy implements Strategy {
 2
 3     /**
 4      * 炮前进策略
 5      * @param a 原位
 6      * @param b  目标位
 7      */
 8     @Override
 9     public void goAhead(int a, int b) {
10         System.out.println("炮"+a+"进"+b);
11     }
12
13     /**
14      * 炮平策略
15      * @param a 原位
16      * @param b  目标位
17      */
18     @Override
19     public void straight(int a, int b) {
20         System.out.println("炮"+a+"平"+b);
21     }
22 }

实现兵的行走策略:

 1 public class SoldierStrategy implements Strategy {
 2
 3     /**
 4      * 兵进策略
 5      * @param a 原位
 6      * @param b  目标位
 7      */
 8     @Override
 9     public void goAhead(int a, int b) {
10         if(b-a==1){
11             System.out.println("兵"+a+"进"+b);
12         }else {
13             System.out.println("我是兵,我只能前进不能后退。");
14         }
15     }
16
17     /**
18      * 兵平策略
19      * @param a 原位
20      * @param b  目标位
21      */
22     @Override
23     public void straight(int a, int b) {
24         if(b-a==1){
25             System.out.println("兵"+a+"平"+b);
26         }else {
27             System.out.println("我是兵,我只能平走一步");
28         }
29     }
30 }

测试:

 1 public class ChessTest {
 2
 3     public static void main(String[] args){
 4         Chess chess = new Chess();//实例化象棋
 5         chess.setStrategy(new GunStrategy());//接入炮的实现策略
 6         chess.straight(5,8);//炮平走
 7
 8         chess.setStrategy(new SoldierStrategy());//接入兵的实现策略
 9         chess.straight(5,8);//兵平走
10
11         chess.setStrategy(new SoldierStrategy());//接入兵的实现策略
12         chess.straight(5,6);//兵平走
13     }
14 }

结果:

1 炮5平8
2 我是兵,我只能平走一步
3 兵5平6

原文地址:https://www.cnblogs.com/yeshensi/p/11684532.html

时间: 2024-10-09 11:42:59

设计模式之美—策略模式的相关文章

设计模式进阶(一) 策略模式

摘自<Design Paterns_Elements of Reusable Object-Oriented Software> 上一系列偏重于入门,从本篇开启进阶系列,着重于设计模式的适用情景. 回顾入门系列 设计模式入门(一)  策略模式 1  Intent Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.

设计模式实现C++ --策略模式Strategy(对象行为型)

1.问题 出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞机.每个策略都可以得到相同的结果,但是它们使用了不同的资源.选择策略的依据 是费用,时间,使用工具还有每种方式的方便程度. 2.解决方案 策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想. strategy模式类图: 3.应用场景 1. 

从“假如有以下几种价格10,20,50,请你代码实现将他们排序输出”看着设计模式中的策略模式

今天重温了一下策略模式,将自己的一些感悟与大家分享...本人只是技术渣渣,所理解的东西的难免会有很大的局限性甚至是错误,还请各位带着批判的眼光去看待....不喜请勿吐槽 定义:策略模式属于设计模式中的对象行为型模式,它将用到的算法单独抽象成一个单独的类.通常,我们在多个类完成同一件事情,仅仅完成的方式不同时,我们可以考虑使用这种设计模式. 举例:相信,很多人在看到"假如有以下几种价格10,20,50,请你代码实现将他们排序输出"这种题目的时候,很快就写出了以下代码,写之前还不忘了问一下

【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件判断语句来进行选择.这

设计模式-行为型-策略模式

策略模式(Strategy): 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理.策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类.用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”. 策略模式的角色: 1)环境类(Context):采用组合或聚合的方式维护一个对Strategy对象的引用. 2)抽象策略类(Strategy):定义所有支持的算法的公共接口.Context使用这个接口来调用某Concret

设计模式(一):策略模式

一.设计背景 现实生活中,我们要做一件事情或者完成某项工作,往往有很多种途径.比如我们出游,可以选择坐汽车,坐火车,土豪点的选择是坐飞机.还有我们现在线下的支付方式也有了很多种选择,以前在外面忘了带钱的话可能一瓶水都难以买到,现在只要我们手机在身上,可以用微信或者支付宝. 在软件设计层面,我们把各种支付方式叫做策略.如果不考虑设计模式的话,我们可能会在一个类中用if..else方式来选择支付方式,即 if(type == 1){ //微信支付 }else if(type == 2){ // 支付

[设计模式] javascript 之 策略模式

定义: 封装一系列的算法,使得他们之间可以相互替换,本模式使用算法独立于使用它的客户的变化. 说明:策略模式,是一种组织算法的模式,核心不在于算法,而在于组织一系列的算法,并且如何去使用它:策略模式作用在于,行为实现的不可预见,面对这样的一种变化,我们得思考如何使用程序好维跟扩展,并使得客户很好的使用算法的方式: 策略模式 使用要注意它 "变化" 的一面,策略模式就是来解决这个 变化 问题的. 比如商场买卖的价格或促销问题,如果不使用模式,就可能只是 把“所有”的情况用 if else

head first 设计模式(-) 策略模式(鸭子)

目的:减少依赖 设计模式对应不同的需求,设计原则则代表永恒的灵魂,在实践中未必时刻遵守,但要时刻牢记. 1.依赖倒转原则(Dependence Inversion Principle) 2.接口隔离原则(Interface Segregation Principle) 3.里氏代换原则(Liskov Substitution Principle) 4.开闭原则(Open Close Principle) 5.迪米特法则(Demeter Principle) 6.合成复用原则(Composite