策略模式

策略模式

鸭子问题

 

传统方案解决鸭子问题

 

传统方案实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.strategy;
 
 
//抽象类 鸭子
public abstract class Duck {
    public Duck() {
    }
    //默认实现
    public void quack(){
        System.out.println("鸭子嘎嘎叫");
    }
    public void swim(){
        System.out.println("鸭子会游泳");
    }
    public void fly(){
        System.out.println("鸭子会飞翔");
    }
    //显示鸭子的信息
    public abstract void display();
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.strategy;
 
public class PekingDuck extends Duck {
    @Override
    public void display() {
        System.out.println("这是北京鸭");
    }
 
    @Override
    public void fly() {
        System.out.println("北京鸭不能飞翔");
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.strategy;
 
public class ToyDuck extends Duck {
    @Override
    public void display() {
        System.out.println("这是玩具鸭");
    }
    @Override
    public void quack() {
        System.out.println("玩具鸭不能嘎嘎叫");
    }
    @Override
    public void swim() {
        System.out.println("玩具鸭不会游泳");
    }
    @Override
    public void fly() {
        System.out.println("玩具鸭不会飞翔");
    }
}
1
2
3
4
5
6
7
8
package com.strategy;
 
public class WildDuck extends Duck {
    @Override
    public void display() {
        System.out.println("这是野鸭");
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
package com.strategy;
 
public class Client {
    public static void main(String[] args) {
        Duck pekingDuck = new PekingDuck();
        pekingDuck.display();
        pekingDuck.fly();
        pekingDuck.quack();
        pekingDuck.swim();
 
    }
}

  

执行结果:

北京鸭不能飞翔
鸭子嘎嘎叫
鸭子会游泳
这是北京鸭

传统方式解决鸭子问题分析和解决方案

策略模式的基本介绍

 

 

策略模式的原理类图

 

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

策略模式解决鸭子问题

 

这里补充一个小知识点哈:

组合:就好比是类中的属性

聚合:就好比是通过构造方法传入参数一样。

 

 

使用策略模式代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.strategy.improve;
 
//抽象类 鸭子
public abstract class Duck {
    //属性 策略接口
    FlyBehavior flyBehavior;
    //protected FlyBehavior flyBehavior;  //这种写法也是可以的
 
    //其他属性 策略接口
    QuackBehavior quackBehavior;
 
    public Duck() {
    }
 
    //默认实现
    public void quack() {
        if(null != quackBehavior){
            quackBehavior.quack();
        }
    }
 
    public void swim() {
        System.out.println("鸭子会游泳");
    }
 
    public void fly() {
        if (null != flyBehavior) {
            flyBehavior.fly();
        }
    }
 
    //显示鸭子的信息
    public abstract void display();
 
    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }
 
    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}

  

1
2
3
4
5
package com.strategy.improve;
 
public interface FlyBehavior {
    public abstract void fly();//子类要具体实现
}

  

1
2
3
4
5
6
7
8
9
10
package com.strategy.improve;
 
 
public class BadFlyBehavior implements FlyBehavior {
 
    @Override
    public void fly() {
        System.out.println("飞翔技术一般");
    }
}

  

1
2
3
4
5
6
7
8
package com.strategy.improve;
 
public class GoodFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("飞翔技术高超");
    }
}

  

1
2
3
4
5
6
7
8
package com.strategy.improve;
 
public class NoFlyBehavior implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("不会飞翔");
    }
}

  

1
2
3
4
5
package com.strategy.improve;
 
public interface QuackBehavior {
    void quack();
}

  

1
2
3
4
5
6
7
8
package com.strategy.improve;
 
public class GaGaQuackBehavior implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("嘎嘎叫");
    }
}

  

1
2
3
4
5
6
7
8
package com.strategy.improve;
 
public class GeGeQuackBehavior implements QuackBehavior{
    @Override
    public void quack() {
        System.out.println("咯咯叫");
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.strategy.improve;
 
public class PekingDuck extends Duck {
    @Override
    public void display() {
        System.out.println("这是北京鸭");
    }
 
    //构造器 传入FlyBehavior
    public PekingDuck() {
        flyBehavior = new NoFlyBehavior();
        quackBehavior = new GeGeQuackBehavior();
    }
 
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.strategy.improve;
 
public class ToyDuck extends Duck {
    @Override
    public void display() {
        System.out.println("这是玩具鸭");
    }
 
 
    @Override
    public void swim() {
        System.out.println("玩具鸭不会游泳");
    }
 
 
    //构造器 传入FlyBehavior
    public ToyDuck() {
        flyBehavior = new BadFlyBehavior();
        quackBehavior = new GeGeQuackBehavior();
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.strategy.improve;
 
public class WildDuck extends Duck {
 
    @Override
    public void swim() {
        super.swim();
    }
 
 
    //构造器 传入FlyBehavior
    public WildDuck() {
        flyBehavior = new GoodFlyBehavior();
        quackBehavior = new GaGaQuackBehavior();
 
    }
 
    @Override
    public void display() {
        System.out.println("这是野鸭");
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.strategy.improve;
 
public class Client {
    public static void main(String[] args) {
        WildDuck wildDuck = new WildDuck();
        System.out.println("野鸭的特征:");
        wildDuck.fly();
        wildDuck.quack();
        ToyDuck toyDuck = new ToyDuck();
        System.out.println("玩具鸭的特征");
        toyDuck.fly();
        toyDuck.quack();
        //动态改变某个对象的行为 玩具鸭子不会飞翔
        toyDuck.setFlyBehavior(new NoFlyBehavior());
        System.out.println("玩具鸭的实际飞翔情况:");
        toyDuck.fly();
    }
}

  

运行结果:

野鸭的特征:
飞翔技术高超
嘎嘎叫
玩具鸭的特征
飞翔技术一般
咯咯叫
玩具鸭的实际飞翔情况:
不会飞翔

策略模式的注意事项和细节

 

posted on   ~码铃薯~  阅读(39)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示