策略模式------《Head First 设计模式》 第一章---策略模式

xzmxddx

  学习方式:书籍《Head First 设计模式》,这本书通俗易懂,所有知识点全部取自本书。

面向对象设计原则

  • 封装变化
  • 多用组合,少用继承
  • 针对接口编程,不针对实现编程
  • 为交互对象之间的松耦合设计而努力
  • 类应该对扩展开放,对修改关闭
  • 依赖抽象,不要依赖具体类
  • 只和朋友交谈
  • 别找我,我会找你
  • 类应该只有一个改变的理由

一、定义

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

  我的理解:举个例子,玩小游戏的时候,我们需要切换武器,每个武器对象所对应的行为不同,但是我们将这些武器(算法族)封装起来,让它们独立替换,不同的武器,有着不同的效果,这里就可以使用策略模式,武器们实现一个共同的接口即可

二、UML类图

  这里我使用了鸭子会飞,会叫,这两个行为的例子,鸭子叫声不一样(算法族),飞行行为也不一样(算法族)

策略模式------《Head First 设计模式》
第一章---策略模式

  eclipse截图:

  策略模式------《Head First 设计模式》
第一章---策略模式

  

三、代码示例

  鸭子抽象类以及子类:

  Duck

package hue.edu.xiong.first.duck;

import hue.edu.xiong.first.fly.FlyBehavior;
import hue.edu.xiong.first.quack.QuackBehavior;

public abstract class Duck {
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public abstract void display();

    public void performFly() {
        flyBehavior.fly();
    }

    public void performQuack() {
        quackBehavior.quack();
    }

    public void swim() {
        System.out.println("All ducks float,even decoys!!");
    }

    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}

  MallardDuck

package hue.edu.xiong.first.duck;

import hue.edu.xiong.first.fly.FlyWithWings;
import hue.edu.xiong.first.quack.Quack;

public class MallardDuck extends Duck {
    public MallardDuck() {
        flyBehavior = new FlyWithWings();
        quackBehavior = new Quack();
    }

    @Override
    public void display() {
        System.out.println("It is MallardDuck!!!");
    }

}

  ModelDuck

package hue.edu.xiong.first.duck;

import hue.edu.xiong.first.fly.FlyNoWay;
import hue.edu.xiong.first.quack.Quack;

public class ModelDuck extends Duck {
    public ModelDuck() {
        flyBehavior = new FlyNoWay();
        quackBehavior = new Quack();
    }

    @Override
    public void display() {
        System.out.println("It is ModelDuck!!!");
    }

}

   飞行行为接口,以及实现类

  FlyBehavior 
package hue.edu.xiong.first.fly;

public interface FlyBehavior {
    public abstract void fly();
}
  FlyNoWay 
package hue.edu.xiong.first.fly;

public class FlyNoWay implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("I can't fly!!");
    }

}

  FlyRocketPowered 

package hue.edu.xiong.first.fly;

public class FlyRocketPowered implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("I'm flying with a rocket!!");
    }

}  
  FlyWithWings 
package hue.edu.xiong.first.fly;

public class FlyWithWings implements FlyBehavior {

    @Override
    public void fly() {
        System.out.println("I'm flying!!");
    }

}

  叫声接口,以及实现类

   QuackBehavior

package hue.edu.xiong.first.quack;

public interface QuackBehavior {
    public abstract void quack();
}

   Quack 

package hue.edu.xiong.first.quack;

public class Quack implements QuackBehavior {

    @Override
    public void quack() {
        System.out.println("Quack");
    }

}
MuteQuack 
package hue.edu.xiong.first.quack;

public class MuteQuack implements QuackBehavior {

    @Override
    public void quack() {
        System.out.println("<< Silence >>");
    }

}
Squeak 
package hue.edu.xiong.first.quack;

public class Squeak implements QuackBehavior {

    @Override
    public void quack() {
        System.out.println("Squeak");
    }

}

四、Main类解析

 1 package hue.edu.xiong.first;
 2 
 3 import hue.edu.xiong.first.duck.Duck;
 4 import hue.edu.xiong.first.duck.MallardDuck;
 5 import hue.edu.xiong.first.fly.FlyNoWay;
 6 import hue.edu.xiong.first.quack.MuteQuack;
 7 
 8 public class Main {
 9 
10     public static void main(String[] args) {
11         //声明并实例化一只MallardDuck
12         Duck duck = new MallardDuck();
13         //测试已经封装的行为
14         duck.performFly();
15         duck.performQuack();
16         duck.display();
17         //更改已经封装的行为,策略模式要点
18         duck.setFlyBehavior(new FlyNoWay());
19         duck.setQuackBehavior(new MuteQuack());
20         //测试
21         duck.performFly();
22         duck.performQuack();
23 //        I'm flying!!
24 //        Quack
25 //        It is ֻMallardDuck!!!
26 //        I can't fly!!
27 //        << Silence >>
28     }
29 
30 }

五、总结

 策略模式是我接触到的第一个模式,很好理解,下一个模式是观察者模式