目录
- 1、项目需求
- 2、传统方案解决鸭子问题的分析和代码实现
- 3、传统方式实现存在的问题分析和解决方案
- 4、策略模式基本介绍
- 5、使用策略模式解决鸭子问题
- 6、策略模式的注意事项和细节
- 7、策略模式的使用场景
以具体项目来演示为什么需要策略模式,策略模式的优点,以及策略模式使用过程中需要注意的问题
1、项目需求
- 有各种有鸭子(野鸭、北京鸭子、烤鸭),鸭子有各种行为(飞、叫),但是各种鸭子的行为又不完全一样
- 显示鸭子信息
2、传统方案解决鸭子问题的分析和代码实现
1)传统设计方案
设计一个抽象父类 duck , 定义各种行为,然后各种鸭子种类继承该父类,重新行为方法
2)代码实现
public abstract class Duck {
public abstract void display();
public void quack() {
System.out.println("鸭子嘎嘎叫~~~");
}
public void swim() {
System.out.println("鸭子会游泳~~~");
}
public void fly() {
System.out.println("鸭子会飞翔~~~");
}
}
public class BjDuck extends Duck{
@Override
public void display() {
System.out.println("这是一直北京鸭子~~~~");
}
@Override
public void fly() {
System.out.println("北京鸭子不能飞翔!!");
}
}
3、传统方式实现存在的问题分析和解决方案
1)存在的问题
不同子类的行为是不一样的,所以每次定义一个子类就需要重写父类的行为,导致代码太耦合
2)解决方式
使用策略模式
4、策略模式基本介绍
策略模式:指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法
策略模式体现了几个原则:
- 把变化的代码从不变的代码中抽离出来
- 针对接口编程而不是类
- 多采用组合,聚合,少用继承的模式
策略模式基本类图:
5、使用策略模式解决鸭子问题
- 封装行为接口,实现算法族
超类中放行为的接口对象,在子类中具体设定行为对象
1) 定义行为接口,行为接口的具体实现类
// 飞行行为
public interface FlyBehavior {
void fly();
}
public class NoflyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println("不会飞");
}
}
public class GoodflyBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println("具备很好的飞行技能!!");
}
}
// 叫行为
public interface QuackBehavior {
void quack();
}
public class NoQuackBehavior implements QuackBehavior {
@Override
public void quack() {
System.out.println("不能叫");
}
}
public class GeGeQuackBehavior implements QuackBehavior{
@Override
public void quack() {
System.out.println("咯咯叫");
}
}
2)超类中聚合行为接口
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public abstract void display();
public void fly() {
flyBehavior.fly();
}
public void quack() {
quackBehavior.quack();
}
}
3)实现类中设置具体的行为对象
public class BjDuck extends Duck{
public BjDuck() {
this.flyBehavior = new BadflyBehavior();
this.quackBehavior = new GeGeQuackBehavior();
}
@Override
public void display() {
System.out.println("我叫做北京鸭子!!");
}
}
4)测试
public class Test {
public static void main(String[] args) {
BjDuck bjDuck = new BjDuck();
bjDuck.display();
bjDuck.fly();
bjDuck.quack();
}
}
6、策略模式的注意事项和细节
- 策略模式的关键是:分析项目中的变化和不变部分
- 核心思想:多使用组合,少使用继承;用行为类进行组合,而不是行为的继承
需要注意的是:每添加一个策略就要增加一个类,当策略过多时会导致类数目庞大!!!
7、策略模式的使用场景
https://blog.csdn.net/m4330187/article/details/121292879