1.模拟鸭子项目
/**
* 鸭子
*/
public abstract class Duck {
public Duck(){
}
public void quack(){
System.out.println("~gagaga~");
}
public abstract void display();
public void swim(){
System.out.println("~im swim~");
}
}
/**
* 绿头鸭子
*/
class GreenHeaderDuck extends Duck{
@Override
public void display() {
System.out.println("我是绿头鸭");
}
public static void main(String[] args) {
Duck duck = new GreenHeadDuck();
duck.display(); //
duck.quack(); //鸭子叫声
duck.swim();//鸭子游泳
}
}
正常鸭子是会嘎嘎叫,和会游泳的。这里没什么问题。
2.项目新需求
突然来了一个新需求,说要加一种会飞的鸭子,这里区别有的鸭子会飞,有的鸭子不会飞。
3.用OO原则解决新需求的不足
如果现在你在超类Duck.java中加入方法:
public void fly(){
System.out.println("~im fly~");
}
那么当前出现问题,不会飞的鸭子也会出现‘im fly’,你可能由这样写,把fly(){}改为
public abstract void fly();
那么所以的鸭子子类都需要实现当前方法。
会飞的鸭子:
@Override
public void fly() {
System.out.println("我会飞");
}
不会飞的
@Override
public void fly() {
System.out.println("我不会飞");
}
这样影响太大,所以的子类都需要实现 ,劳动量太大
4.用策略模式来新需求解决
1.分析项目变化与不变化部分,提取变化部分,抽象成接口+实现
2.鸭子哪些功能会根据新需求变化的?比如上面的 ’飞行‘
public interface FlyBehavior{
void fly();
}
实现飞行:
public class MyFlyBehavior implements FlyBehavior {
public void fly() {
System.out.println("我会飞");
}
}
好处:新增行为简单,行为类更好的复用
5.重新设计模拟鸭子项目
/**
* 鸭子
*/
public abstract class Duck {
FlyBehavior flyBehavior;
public Duck(){
}
/**
* 重新定义fly
*/
public void Fly(){
flyBehavior.fly();
}
public void quack(){
System.out.println("~gagaga~");
}
public abstract void display();
public void swim(){
System.out.println("~im swim~");
}
}
public class GreenHeadDuck extends Duck {
public GreenHeadDuck(){
flyBehavior = new MyFlyBehavior();
}
@Override
public void display() {
System.out.println("我是绿头鸭");
}
}
6.总结策略模式定义
封装行为为接口,超类里放行为接口对象,在子类里具体设定行为对象,
原则:分离变化部分,封装接口,基于接口编程各种功能,此模式让行为
算法的变化独立于算法的使用者