时光荏苒,岁月如梭,不知不觉2020就这么过去了。新的一年,预祝大家心想事成、身体健康。
策略模式是行为型设计模式的一种。
策略模式的核心思想是:定义算法族(可以理解为多组算法、行为),将其分别封装起来,并且确保他们之间可以相互替换。这样做可以将算法的变化独立于使用算法的用户。
可能通过这些专业的术语还是不太好理解什么是策略模式。那么我打个比方:中午了要去吃饭了,我们可以选择米饭、面条、水饺、炒饼等等……这其中的每一个食物我们都可以将其看作是一个策略。
策略模式中体现出了三个设计原则:
1、将变化的代码从不变的代码中分离出来。
2、面向接口编程。
3、尽可能地少使用继承,可以使用组合和聚合替代。
类图讲解
Strategy:策略接口,抽象出了相关方法。
ConcreteStrategyA/B:具体策略类,实现了策略接口。
Context:环境对象,类中聚合了策略接口。
Client:客户端测试类。
案例:通过策略模式实现运动员通过不同方式进行游泳。
游泳行为接口 => 策略接口
public interface SwimBehavior {
// 游泳
void swim();
}
具体游泳行为
/**
* 仰泳
*/
public class Backstroke implements SwimBehavior {
@Override
public void swim() {
System.out.println("正在进行仰泳!");
}
}
/**
* 蛙泳
*/
public class Breaststroke implements SwimBehavior {
@Override
public void swim() {
System.out.println("正在进行蛙泳!");
}
}
/**
* 潜泳
*/
public class Diving implements SwimBehavior {
@Override
public void swim() {
System.out.println("正在进行潜泳!");
}
}
游泳运动员 => 对应Context角色
public class Swimmers {
// 游泳行为接口
private SwimBehavior swimBehavior;
// 运动员姓名
private String name;
// 构造方法
public Swimmers(SwimBehavior swimBehavior) {
this.swimBehavior = swimBehavior;
}
// 游泳
public void swim() {
System.out.print("比赛开始,运动员:" + name);
swimBehavior.swim();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
客户端测试类
public class Client {
public static void main(String[] args) {
Swimmers swimmers = new Swimmers(new Backstroke());
swimmers.setName("编程小菜鸟");
swimmers.swim();
}
}
执行结果
1、使用策略模式的关键在于学会分析项目中变化和不变的部分。
2、使用策略模式可以促使代码变得更加有弹性、易于扩展、易于维护。
3、策略模式符合开闭原则,当需要新增行为时只需添加一种策略即可。
4、策略模式的缺点是当策略过多时会导致类的数量庞大。
今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞、转发加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。