第二节:策略模式——基本介绍&应用

一、策略模式

  1、基本介绍

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

    (2)这算法体现了几个设计原则:

        第一:把变化的代码从不变的代码中分离出来;

        第二:针对接口编程而不是具体类(定义了策略接口);

        第三:多用组合/聚合,少用继承(客户通过组合方式使用策略);

  2、原理类图

    

     说明,从上图可以看到,客户 context 有成员变量 strategy 或者其他的策略接口,至于需要使用到那个策略,我们可以在构造器或者 setter 方法指定。

二、策略模式解决鸭子问题

  1、实例要求

    编写程序完成前面的鸭子项目,要求使用策略模式;

  2、思路分析

    策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。

    原则就是:分离变化部分,封装接口,基于接口编程各种功能。

    此模式让行为的变化独立于算法的使用者。

    

  3、代码实现

    策略接口:

1 public interface FlyBehavior {
2 
3     /**
4      * 子类具体实现
5      */
6     void fly();
7 }

    接口实现类:

 1 public class GoodFlyBehavior implements FlyBehavior{
 2     @Override
 3     public void fly() {
 4         System.out.println("飞翔技术高超~~~");
 5     }
 6 }
 7 -----------------------------------------------
 8 public class BadFlyBehavior implements FlyBehavior{
 9     @Override
10     public void fly() {
11         System.out.println("飞翔技术一般~");
12     }
13 }
14 
15 -----------------------------------------------
16 public class NoFlyBehavior implements FlyBehavior{
17     @Override
18     public void fly() {
19         System.out.println("不会飞翔");
20     }
21 }

  鸭子抽象类:

 1 public abstract class Duck {
 2 
 3     /**
 4      * 属性,策略接口
 5      */
 6     FlyBehavior flyBehavior;
 7     //还会有其他属性 <-> 策略接口
 8 
 9     public Duck() {
10 
11     }
12 
13     /**
14      * 显示鸭子信息
15      */
16     public abstract void display();
17 
18     public void fly() {
19         if (flyBehavior != null) {
20             flyBehavior.fly();
21         }
22     }
23 
24     public void setFlyBehavior(FlyBehavior flyBehavior) {
25         this.flyBehavior = flyBehavior;
26     }
27 }

  具体实现鸭子类:

 1 public class WildDuck extends Duck{
 2 
 3     public WildDuck() {
 4         flyBehavior = new GoodFlyBehavior();
 5     }
 6 
 7     @Override
 8     public void display() {
 9         System.out.println("这是野鸭");
10     }
11 
12 }
13 -------------------------------------------------
14 public class PekingDuck extends Duck{
15 
16     public PekingDuck() {
17         flyBehavior = new BadFlyBehavior();
18     }
19 
20     @Override
21     public void display() {
22         System.out.println("~~~北京鸭~~~");
23     }
24 
25 }
26 -------------------------------------------------
27 public class ToyDuck extends Duck{
28 
29     public ToyDuck() {
30         flyBehavior = new NoFlyBehavior();
31     }
32 
33     @Override
34     public void display() {
35         System.out.println("~~~玩具鸭~~~");
36     }
37 }

  客户端:

 1 public class Client {
 2     public static void main(String[] args) {
 3         WildDuck wildDuck = new WildDuck();
 4         wildDuck.fly();
 5 
 6         ToyDuck toyDuck = new ToyDuck();
 7         toyDuck.fly();
 8 
 9         PekingDuck pekingDuck = new PekingDuck();
10         pekingDuck.fly();
11 
12         //动态改变某个对象的行为
13         pekingDuck.setFlyBehavior(new NoFlyBehavior());
14 
15         System.out.println("北京鸭的实际飞翔能力");
16         pekingDuck.fly();
17     }
18 }

 

原文地址:https://www.cnblogs.com/niujifei/p/14477551.html