您的位置:首页 > 其它

设计模式之美—策略模式

2019-10-16 17:09 796 查看

策略模式

什么是策略模式

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

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

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

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

 

public class Chess {

/**
* 兵前进算法
* @param a 原位
* @param b 目标为
*/
public void soldierGoAhead(int a, int b){
System.out.println("兵"+a+"进"+b);
}

/**
* 炮前进算法
* @param a 原位
* @param b 目标为
*/
public void gunGoAhead(int a, int b){
System.out.println("炮"+a+"进"+b);
}
}

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

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

抽象的策略接口:

public interface Strategy {

/**
* 前进策略
* @param a 原位
* @param b  目标位
*/
public void goAhead(int a, int b);

/**
* 平策略
* @param a 原位
* @param b  目标位
*/
public void straight(int a, int b);
}

实现炮的行走策略:

public class GunStrategy implements Strategy {

/**
* 炮前进策略
* @param a 原位
* @param b  目标位
*/
@Override
public void goAhead(int a, int b) {
System.out.println("炮"+a+"进"+b);
}

/**
* 炮平策略
* @param a 原位
* @param b  目标位
*/
@Override
public void straight(int a, int b) {
System.out.println("炮"+a+"平"+b);
}
}

实现兵的行走策略:

public class SoldierStrategy implements Strategy {

/**
* 兵进策略
* @param a 原位
* @param b  目标位
*/
@Override
public void goAhead(int a, int b) {
if(b-a==1){
System.out.println("兵"+a+"进"+b);
}else {
System.out.println("我是兵,我只能前进不能后退。");
}
}

/**
* 兵平策略
* @param a 原位
* @param b  目标位
*/
@Override
public void straight(int a, int b) {
if(b-a==1){
<
1d44
span style="color: #008080;">25             System.out.println("兵"+a+"平"+b);
}else {
System.out.println("我是兵,我只能平走一步");
}
}
}

测试:

public class ChessTest {

public static void main(String[] args){
Chess chess = new Chess();//实例化象棋
chess.setStrategy(new GunStrategy());//接入炮的实现策略
chess.straight(5,8);//炮平走

chess.setStrategy(new SoldierStrategy());//接入兵的实现策略
chess.straight(5,8);//兵平走

chess.setStrategy(new SoldierStrategy());//接入兵的实现策略
chess.straight(5,6);//兵平走
}
}

结果:

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

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: