策略模式(StrategyPattern)

来源:互联网 发布:php redis 使用 编辑:程序博客网 时间:2024/05/01 17:08

策略模式: 定义算法组,分别封装起来, 让他们之间可以互相替换, 此模式让算法的变化独立于使用算法的客户。 

这是我第一次正式接触设计模式, 学习了组合和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 {@Overridepublic void fly() {System.out.println("[FlyRocketPowered]I'm fly with a rocket!!");}}

FlyWithWings.java

public class FlyWithWings implements FlyBehavior {@Overridepublic void fly() {System.out.println("[Duck]I'm Flyying!!");}}

FlyNoWay.java

public class FlyNoWay implements FlyBehavior {@Overridepublic void fly() {System.out.println("[Duck]I can't fly!!");}}

3、QuackBehavior接口及其实现类

QuackBehavior.java

public interface QuackBehavior {public void quack();}

Quack.java

public class Quack implements QuackBehavior {@Overridepublic void quack() {System.out.println("[Duck]quack");}}
MuteQuack.java

public class MuteQuack implements QuackBehavior {@Overridepublic void quack() {System.out.println("[Duck]<< Silence >>");}}
Squeak.java

public class Squeak implements QuackBehavior {@Overridepublic void quack() {System.out.println("[Duck]squeak");}}


4、制造一个新的鸭子类型:

public class ModelDuck extends Duck {public ModelDuck() {flyBehavior = new FlyNoWay();quackBehavior = new Quack();}@Overridepublic 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设计模式》书学习, 代码也参照该书编写

原创粉丝点击