面向对象设计模式之策略模式

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

2.抽象鸭子类,鸭子飞行行为在此处类似于算法族

 1 package com.pattern.strategy;
 2 /**
 3  * 抽象鸭子
 4  * @author Administrator
 5  *
 6  */
 7 public abstract class Duck {
 8     
 9     FlyBehavior fb;//行为接口声明两个引用变量,所有鸭子子类都继承他
10     Quack q; //鸭子鸣叫行为接口
11     
12 
13     //加入两个set方法,用来改变鸭子的行为
14     public void setFb(FlyBehavior fb) {
15         this.fb = fb;
16     }
17 
18     public void setQ(Quack q) {
19         this.q = q;
20     }
21 
22     public Duck() {
23         // TODO Auto-generated constructor stub
24     }
25     
26     public abstract void display();//展示鸭子的样子,不同的鸭子样子不一样
27     
28     //鸭子的飞行委托给行为类
29     public void performFly(){
30         fb.fly();
31     }
32     
33     public void performQuack(){
34         q.quack();
35     }
36     //所有的鸭子都会游泳
37     public void swim(){
38         System.out.println("all ducks float,even decoys!");
39     }
40 
41 }

3.鸭子飞行行为接口

 1 package com.pattern.strategy;
 2 /**
 3  * 所有飞行行为类必须实现此接口
 4  * @author Administrator
 5  *
 6  */
 7 public interface FlyBehavior {
 8     
 9     public void fly();
10     
11     
12 
13 }
14 /**
15  * 飞行行为的实现者,给真会飞的鸭子用
16  * @author Administrator
17  *
18  */
19 class FlyWithWings implements FlyBehavior{
20 
21     @Override
22     public void fly() {
23         System.out.println("I AM FLYING!");
24         
25     }
26     
27 }
28 /**
29  * 飞行行为的实现者,给不会飞的鸭子用
30  * @author Administrator
31  *
32  */
33 class FlyNoWay implements FlyBehavior{
34 
35     @Override
36     public void fly() {
37         System.out.println("I CANT'T FLY!");
38         
39     }
40     
41 }
42 /**
43  * 增加一个火箭动力飞行行为
44  * @author Administrator
45  *
46  */
47 class RocketFly implements FlyBehavior{
48 
49     @Override
50     public void fly() {
51         System.out.println("一飞冲天");
52         
53     }
54     
55 }

4.鸭子鸣叫行为接口

package com.pattern.strategy;
/**
 * 所有鸣叫行为类必须实现此接口
 * @author Administrator
 *
 */
public interface Quack {
    
    public void quack();

}
//呱呱叫的行为实现
class QQuack implements Quack{

    @Override
    public void quack() {
        System.out.println("quack quack!");
        
    }
    
}
//吱吱叫的行为实现
class Squack implements Quack{

    @Override
    public void quack() {
        System.out.println("ZHI ZHI");
        
    }
    
}
/**
 * 不会叫的行为实现
 * @author Administrator
 *
 */
class Silence implements Quack{

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

5.鸭子的实现类绿头鸭,会飞也会叫

package com.pattern.strategy;
/**
 * 鸭子的实现类,绿头鸭
 * @author Administrator
 *
 */
public class MallDuck extends Duck {
    

    public MallDuck() {
        super();
        fb = new FlyWithWings();//绿头鸭带翅膀会飞
        q  = new QQuack();//绿头鸭是呱呱叫
        // TODO Auto-generated constructor stub
    }

    @Override
    public void display() {
        System.out.println("i am  a MallDuck");

    }

}

6.鸭子实现类模型鸭子,不会飞,也不会叫

package com.pattern.strategy;
/**
 * 模型鸭子
 * @author Administrator
 *
 */
public class ModelDuck extends Duck {
    

    public ModelDuck() {

        super();
        fb = new FlyNoWay();
        q = new Silence();
        // TODO Auto-generated constructor stub
    }

    @Override
    public void display() {
        System.out.println("我 是 模型 鸭子");

    }

}

7.客户端测试代码

package com.pattern.strategy;
/**
 * 测试类,把行为看做一个算法族,算法代表鸭子能做的事,客户使用封装好的飞行和呱呱叫算法族
 * 这种做法就是组合,鸭子的行为不是继承来的,而是适当的行为对象组合来的,如FlyBehavior和Quack
 * 使用组合将算法组封装成类,可以运行时动态的改变行为
 * @author Administrator
 *
 */
public class Simulator {

    public static void main(String[] args) {
        Duck d = new MallDuck();
        d.performFly();
        d.performQuack();
        
        Duck model = new ModelDuck();
        model.performFly();//模型鸭子不会飞
        //我突然想让他飞
        model.setFb(new RocketFly());//运行时改变鸭子的行为,只需要调用set方法即可
        model.performFly();

    }

}

8.测试结果

9.

常见开发中场景:
---JAVASE中GUI编程,布局管理
---Spring框架中,Resource接口,资源访问策略
---javax.servlet.http.HttpServlet#service();

需要程序源码的可以加我微信x241602私聊。
原文地址:https://www.cnblogs.com/huipengbo/p/6876377.html