策略模式
目录
一、从简单的模拟鸭子应用开始
Joe上班的公司做了一套模拟鸭子的游戏:SimUDuck。游戏中的各种鸭子一边游泳戏水,一边呱呱叫。此系统内部设计使用了标准的OO技术,设计了一个鸭子超累,并且让各种鸭子继承此超类。
public abstract class Duck { //抽象类
public Duck() {
}
public void Quack() {
System.out.println("~~gaga~~");
}
public abstract void display(); //抽象方法,每个子类都必须实现该方法
public void swim() {
System.out.println("~~im swim~~");
}
public void Fly() { //添加一个fly()方法
System.out.println("~~im fly~~");
}
public class RedHeadDuck extends Duck {
@Override
public void display() {
System.out.println("**RedHead**");
}
此时项目中需要添加新的功能,比说要程序中需要有会飞的鸭子,此时Joe在Duck类上添加了fly方法,这种方法有个弊端,所有的子类都会包含有fly方法,并非所有的duck类的子类都会飞。
Joe想到一个方法:用覆盖的方式把不会飞的子类中fly方法覆盖掉
public class GreenHeadDuck extends Duck {
//不会飞的鸭子
@Override
public void display() {
System.out.println("**GreenHead**");
}
public void Fly() { //覆盖
System.out.println("~~no fly~~");
}
}
用继承的方式来提供Duck的行为,会导致以下缺点:
1.代码会在多个子类中重复
2.运行时的行为不容易改变
3.无法得知所有鸭子的全部行为,并且鸭子不能够同时飞又叫
4.改变Duck类代码,会影响其他鸭子一起发生改变
二、改进版的鸭子应用
Joe把fly方法抽取出来,放进一个flyable接口中,这样一来,只有会飞的鸭子才实现此接口。同样的他也可以设计一个Quackable接口,并不是所有的鸭子都会叫。