您的位置:首页 > 其它

Head First 设计模式:1策略模式

2014-08-08 10:12 323 查看

策略模式

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

设计原则1:

找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

设计原则2:

针对接口编程,而不是针对实现编程。

设计原则3:

多用组合,少用继承。

问题解决:

joe上班的公司做了一套相当成功的模拟鸭子游戏:simuduck。游戏中会出现各种鸭子,一边游泳戏水,一边呱呱叫,此系统的内部设计使用了标准的OO技术,设计了一个鸭子超类(Superclass),并让各种鸭子继承此超类。

分析:

由于游戏中会出现各种鸭子,游泳,呱呱叫。所以一开始的思路是:



但是转念一想就会发现这个设计是非常失误的,因为如果公司决定加入新的类型的鸭子,比如说要求这个鸭子要会飞,另一个鸭子要会唱歌,那么怎么办,难道要在Duck类中加入fly();方法,可是这样一来就会使的其他类型的鸭子继承Duck类,也会让他们会飞,会唱歌了。

于是乎我们的第一个设计模式出场啦!!!

下面欢迎策略模式 山药 出场!!!!



下面就是代码实现了!!

两个接口:

public interface FlyBehavior {

public void fly();

}

public interface QuackBehavior {

public void quack();

}

几个类实现这两个接口:

1,实现Quack

public class Quack implements QuackBehavior {

@Override

public void quack() {

System.out.println("Quack!");

}

}

public class Squeak implements QuackBehavior {

@Override

public void quack() {

System.out.println("Squeak!");

}

}

2,实现Fly

public class FlyNoWay implements FlyBehavior{

@Override

public void fly() {

System.out.println("i can`t fly!");

}

}

public class FlyWithSwing implements FlyBehavior {

@Override

public void fly() {

System.out.println("I`m flying!!");

}

}

public class FlyRocketPowered implements FlyBehavior {

@Override

public void fly() {

System.out.println("I am flying with a rocket!");

}

}

Duck超类:

public abstract class Duck {

FlyBehavior flyBehavior; //两个接口

QuackBehavior quackBehavior;

public Duck(){

}

public abstract void display();

//这里用abstrack让其他继承的类可以实现不同方法

public void performFly(){

flyBehavior.fly();

}

public void performQuack(){

quackBehavior.quack();

}

public void swim(){

System.out.println("All ducks float,even decoys!");

}

//使用set方法,可以实现动态的改变

public void setFlyBehavior(FlyBehavior fly){

flyBehavior = fly;

}

public void setQuackBehavior(QuackBehavior qu){

quackBehavior = qu;

}

}

实现类:

1,

public class MallardDuck extends Duck{

public MallardDuck(){//构造方法,直接实现不同的飞行和叫的方式

quackBehavior = new Quack();

flyBehavior = new FlyWithSwing();

}

@Override

public void display() {

System.out.println("I am a real Mallard duck!");

}

}

2,

public class ModeDuck extends Duck{

public ModeDuck(){

flyBehavior = new FlyNoWay();

quackBehavior = new Quack();

}

@Override

public void display() {

System.out.println("I am a Mode Duck!");

}

}

测试:

public class MiniDuckSimulator {

public static void main(String[] args) {

Duck mallard = new MallardDuck();

mallard.display();

mallard.performFly();

mallard.performQuack();

System.out.println("*******************");

Duck mode = new ModeDuck();

mode.display();

mode.performFly();

//这里就动态的改变了其飞行方法

mode.setFlyBehavior(new FlyRocketPowered());

mode.performFly();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: