设计模式(1) 策略模式

来源:互联网 发布:avfun邀请码淘宝 编辑:程序博客网 时间:2024/06/07 06:36

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

需求: 设计一些可以动态改变的鸭子。

设计一些行为类

FlyBehavior.java (飞行动作接口,所有飞行行为必须实现该类)
package chapter1;/** * Created by fengyuwusong on 2017/7/29. *///所有飞行行为必须实现该接口public interface FlyBehavior {    public void fly();}
FlyWithWings(飞行行为类,用翅膀飞)
package chapter1;/** * Created by fengyuwusong on 2017/7/29. */public class FlyWithWings implements FlyBehavior {    @Override    public void fly() {        System.out.println("我可以用翅膀飞!");    }}
QuackBehavior.java(叫行为接口,所有叫声行为都必须实现该类)
package chapter1;/** * Created by fengyuwusong on 2017/7/29. *///实现叫声的接口public interface QuackBehavior {    public void quack();}
Quack.java (叫声行为类,呱呱叫)
package chapter1;/** * Created by fengyuwusong on 2017/7/29. */public class Quack implements QuackBehavior {    @Override    public void quack() {        System.out.println("呱呱叫!");    }}
MuteQuack.java(叫声行为类 ,不会叫的)
package chapter1;/** * Created by fengyuwusong on 2017/7/29. */public class MuteQuack implements QuackBehavior {    @Override    public void quack() {        System.out.println("我不会叫!");    }}

设计鸭子抽象类

Duck.java(鸭子抽象类,所有鸭子的实现都必须基于该类)
package chapter1;/** * Created by fengyuwusong on 2017/7/29. */public abstract class Duck {    public FlyBehavior getFlyBehavior() {        return flyBehavior;    }    public void setFlyBehavior(FlyBehavior flyBehavior) {        this.flyBehavior = flyBehavior;    }    public QuackBehavior getQuackBehavior() {        return quackBehavior;    }    public void setQuackBehavior(QuackBehavior quackBehavior) {        this.quackBehavior = quackBehavior;    }    FlyBehavior flyBehavior;    QuackBehavior quackBehavior;    //必须实现声明类别的方法    public abstract void display();    //将叫和飞委托给行为类    public void performFly() {        flyBehavior.fly();    }    public void performQuack(){        quackBehavior.quack();    }    public void swim() {        System.out.println("所有的鸭子都会游泳!");    }}

设计一些具体鸭子

ModelDuck.java(模型鸭,不会飞,不会叫)
package chapter1;/** * Created by fengyuwusong on 2017/7/29. */public class ModelDuck extends Duck {    public ModelDuck(){        //不会飞        flyBehavior=new FlyNoWay();        //不会叫        quackBehavior=new MuteQuack();    }    @Override    public void display() {        System.out.println("我是一只模型鸭,不会飞,不会叫!");    }}
TrueDuck.java(真正的鸭子,会飞,会叫)
package chapter1;/** * Created by fengyuwusong on 2017/7/29. */public class TrueDuck extends Duck{    public TrueDuck() {        flyBehavior=new FlyWithWings();        quackBehavior=new Quack();    }    @Override    public void display() {        System.out.println("我是一只真正的鸭子,,会飞,会叫!");    }}

编写测试类

test.java
package chapter1;/** * Created by fengyuwusong on 2017/7/29. */public class test {    public static void main(String[] args) {//        新建一个模型鸭 这里使用 Duck        Duck model=new ModelDuck();        model.display();        model.performFly();        model.performQuack();//        新建一个真正的鸭子        Duck trueDuck=new TrueDuck();        trueDuck.display();        trueDuck.performFly();        trueDuck.performQuack();        //动态改变模型鸭子的行为,给他装上翅膀        model.setFlyBehavior(new FlyWithWings());        model.performFly();    }}
运行结果

我是一只模型鸭,不会飞,不会叫!
我不会飞!
我不会叫!
我是一只真正的鸭子,,会飞,会叫!
我可以用翅膀飞!
呱呱叫!
我可以用翅膀飞!

文章参考Head First 设计模式

原创粉丝点击