1.利用传统方法“模拟鸭子游戏”
首先我们用面向对象的传统方法来完成这个项目
创建鸭子的超类:拥有叫、外观以及游泳的特性
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 class GreenHeadDuck extends Duck {
@Override
public void display() {
System.out.println("**GreenHead**");
}
}
public class RedHeadDuck extends Duck {
@Override
public void display() {
System.out.println("**RedHead**");
}
}
这时他们都具有了叫和游泳的特性。
当我们想给鸭子添加飞行的行为时。会想到在超类中添加飞行的行为
public abstract class Duck {
...
public void Fly() {
System.out.println("~~im fly~~");
}
}
这时继承超类的所有子类都拥有了该行为,那么出现了一个问题:有的鸭子可以飞
但飞的的不好,有的飞的好,在超类中加如这一行为显然不能满足需求。当然也可以在子类中重写这一方法例如:
public class GreenHeadDuck extends Duck {
@Override
public void display() {
System.out.println("**GreenHead**");
}
public void Fly() {
System.out.println("~~no fly~~");
}
}
单如果子类的数量多,显然是不符合实际的。
2.策略模式“模拟鸭子游戏”
首先我们创建飞行的抽象接口:
public interface FlyBehavior {
void fly();
}
接着创建两个接口实例:飞的好,和飞的不好
public class GoodFlyBehavior implements FlyBehavior
{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--GoodFly--");
}
}
public class BadFlyBehavior implements FlyBehavior
{
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--BadFly--");
}
}
我们再创建一个鸭子的超类
public abstract class Duck {
FlyBehavior mFlyBehavior;
public Duck() {
}
public void Fly() {
mFlyBehavior.fly();
}
public void Quack() {
System.out.println("~~gaga~~");
}
public abstract void display();
public void SetFlyBehavoir(FlyBehavior fb) {
mFlyBehavior = fb;
}
public void swim() {
System.out.println("~~im swim~~");
}
}
再创建子类
public class GreenHeadDuck extends Duck {
public GreenHeadDuck() {
mFlyBehavior = new GoodFlyBehavior();
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("**GreenHead**");
}
}
这样在就可以解决上面的问题了,也可以用SetFlyBehavoir()set行为的方法更灵活的创建对象。
3.策略模式定义
分别封装行为接口。实现算法族,超类里方接口对象,在子类设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法变化独立于算法使用者。
4.策略模式注意点
1.分析项目中变化部分与不变的部分
2.多用组合少用继承:使用行为类的组合,而不是行为的继承。更有弹性
3.设计模式有没有相应库或框架的直接使用?有些库或框架本身就使用某些设计模式设计的
4.找不到相应的设计模式怎么办,灵活的使用接口,和实现类