第一章---策略模式
xzmxddx
学习方式:书籍《Head First 设计模式》,这本书通俗易懂,所有知识点全部取自本书。
面向对象设计原则
- 封装变化
- 多用组合,少用继承
- 针对接口编程,不针对实现编程
- 为交互对象之间的松耦合设计而努力
- 类应该对扩展开放,对修改关闭
- 依赖抽象,不要依赖具体类
- 只和朋友交谈
- 别找我,我会找你
- 类应该只有一个改变的理由
一、定义
策略模式:定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的用户。
我的理解:举个例子,玩小游戏的时候,我们需要切换武器,每个武器对象所对应的行为不同,但是我们将这些武器(算法族)封装起来,让它们独立替换,不同的武器,有着不同的效果,这里就可以使用策略模式,武器们实现一个共同的接口即可
二、UML类图
这里我使用了鸭子会飞,会叫,这两个行为的例子,鸭子叫声不一样(算法族),飞行行为也不一样(算法族)
eclipse截图:
三、代码示例
鸭子抽象类以及子类:
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 }
五、总结
策略模式是我接触到的第一个模式,很好理解,下一个模式是观察者模式