策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
优点:
- 算法可以自由切换。
- 避免使用多重条件判断。
- 扩展性良好。
缺点:
- 策略类会增多。
- 所有策略类都需要对外暴露。
何时使用:
一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:
将这些算法封装成一个一个的类,任意地替换。
注意事项:
如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
案例实现:
1. 案例说明
在一个射击游戏中,有不同种类的飞机,模拟飞机在使用不同道具时,他的外观会改变
2. 案例实现
/**
* Author:YANKAI
* Date:2019/4/18
* Time:15:09
* Desc:飞机的主类
*/
abstract class Plain {
/* 飞机的外观*/
DisplayBehavior displayBehavior;
public Plain() {
}
public void display() {
displayBehavior.display();
}
public void setDisplayBehavior(DisplayBehavior displayBehavior) {
this.displayBehavior = displayBehavior;
}
}
/**
* Author:YANKAI
* Date:2019/4/18
* Time:15:26
* Desc:外观接口
*/
interface DisplayBehavior {
void display();
}
/**
* Author:YANKAI
* Date:2019/4/18
* Time:15:19
* Desc:绿色外观
*/
class GreenBehavior implements DisplayBehavior {
@Override
public void display() {
System.out.println("绿色的外观");
}
}
/**
* Author:YANKAI
* Date:2019/4/18
* Time:15:20
* Desc:红色外观
*/
class RedBehavitor implements DisplayBehavior {
@Override
public void display() {
System.out.println("红色的外观");
}
}
/**
* Author:YANKAI
* Date:2019/4/18
* Time:15:17
* Desc:绿飞机
*/
class GreenPlain extends Plain {
public GreenPlain() {
displayBehavior = new GreenBehavior();
}
}
/**
* Author:YANKAI
* Date:2019/4/18
* Time:15:17
* Desc:红飞机
*/
class RedPlain extends Plain {
public RedPlain() {
displayBehavior = new RedBehavitor();
}
}
/**
* Author:YANKAI
* Date:2019/4/18
* Time:15:28
* Desc:飞机测试类
*/
public class StrategyPattern {
public static void main(String[] args) {
// 创建对象
Plain greenPlain = new GreenPlain();
Plain redPlain = new RedPlain();
System.out.println("-------打印greenPlain的外观-------");
// 输出绿色飞机的外观
greenPlain.display();
System.out.println("-------打印redPlain外观-------");
// 输出红色飞机的外观
redPlain.display();
System.out.println("-------打印greenPlain修改后的外观-------");
// 改变绿色飞机的外观
greenPlain.setDisplayBehavior(new RedBehavitor());
greenPlain.display();
}
}