`
wmj2003
  • 浏览: 97726 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

设计模式-策略模式

阅读更多
  1. publicabstractclassDuck{
  2. FlyBehaviorflyBehavior;
  3. QuackBehaviorquackBehavior;
  4. publicDuck(){
  5. }
  6. publicvoidsetFlyBehavior(FlyBehaviorfb){
  7. flyBehavior=fb;
  8. }
  9. publicvoidsetQuackBehavior(QuackBehaviorqb){
  10. quackBehavior=qb;
  11. }
  12. abstractvoiddisplay();
  13. publicvoidperformFly(){
  14. flyBehavior.fly();
  15. }
  16. publicvoidperformQuack(){
  17. quackBehavior.quack();
  18. }
  19. publicvoidswim(){
  20. System.out.println("Allducksfloat,evendecoys!");
  21. }
  22. }
  1. publicinterfaceFlyBehavior{
  2. publicvoidfly();
  3. }

  1. publicinterfaceQuackBehavior{
  2. publicvoidquack();
  3. }

  1. publicclassFlyWithWingsimplementsFlyBehavior{
  2. publicvoidfly(){
  3. System.out.println("I'mflying!!");
  4. }
  5. }

  1. publicclassRedHeadDuckextendsDuck{
  2. publicRedHeadDuck(){
  3. flyBehavior=newFlyWithWings();//子类中改变实现,且互不影响。
  4. quackBehavior=newQuack();
  5. }
  6. publicvoiddisplay(){
  7. System.out.println("I'marealRedHeadedduck");
  8. }
  9. }

测试代码如下:

RedHeadDuck redHeadDuck = new RedHeadDuck();

redHeadDuck.performFly();
redHeadDuck.display();

输出结果:

I'm flying!!
I'm a real Red Headed duck

下面我们可以实现其他飞的方式,例如乘火箭

  1. publicclassFlyRocketPoweredimplementsFlyBehavior{
  2. publicvoidfly(){
  3. System.out.println("I'mflyingwitharocket");
  4. }
  5. }

测试代码:

RedHeadDuck redHeadDuck = new RedHeadDuck();
redHeadDuck.setFlyBehavior(new FlyRocketPowered());
redHeadDuck.display();
redHeadDuck.performFly();

输出结果:

I'm a real Red Headed duck
I'm flying with a rocket

小结:

可见策略模式定义了算法,将他们分别封装,他们之间可以相互替换。(例如:FlyWithWings和FlyRocketPowered)

这样每个实现都相互不影响。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics