策略模式: 定义算法组,分别封装起来, 让他们之间可以互相替换, 此模式让算法的变化独立于使用算法的客户。
这是我第一次正式接触设计模式, 学习了组合和interface的用法。
举个例子:跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。
在本文中, 我们用duck模型来模拟策略模式。
1、基础类:
Duck.java
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public void swim() {
System.out.println("[Duck]swim:");
}
public abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
}
2、FlyBehavior接口与行为实现类
FlyBehavior.java
public interface FlyBehavior {
public void fly();
}
FlyRocketPowered.java
public class FlyRocketPowered implements FlyBehavior {
@Override
public void fly() {
System.out.println("[FlyRocketPowered]I'm fly with a rocket!!");
}
}
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("[Duck]I'm Flyying!!");
}
}
FlyNoWay.java
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("[Duck]I can't fly!!");
}
}
3、QuackBehavior接口及其实现类
QuackBehavior.javapublic interface QuackBehavior {
public void quack();
}
Quack.java
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("[Duck]quack");
}
}
MuteQuack.java
public class MuteQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("[Duck]<< Silence >>");
}
}
Squeak.java
public class Squeak implements QuackBehavior {
@Override
public void quack() {
System.out.println("[Duck]squeak");
}
}
4、制造一个新的鸭子类型:
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("[ModelDuck]display: I'm a ModelDuck");
}
}
5、测试类:
MiniDuckMain.java
public class MiniDuckMain {
public static void main(String[] args) {
Duck model = new ModelDuck();
model.performFly();
model.performQuack();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();
}
}
最近在参照《Head First设计模式》书学习, 代码也参照该书编写