开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1963

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1240|回复: 13

[云图] 设计模式深入学习--Strategy 策略模式(行为型模式)

[复制链接]  [移动端链接]
排名
307
昨日变化

45

主题

375

帖子

4410

积分

Rank: 9Rank: 9Rank: 9

UID
42814
好友
35
蛮牛币
1568
威望
0
注册时间
2014-8-31
在线时间
1368 小时
最后登录
2017-11-18

专栏作家

QQ
发表于 2016-12-14 09:09:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 z7232124 于 2016-12-14 09:09 编辑

        大家好,我是云图。这次来说说Strategy 策略模式,Strategy 策略模式在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。 我们先来看看Strategy 策略模式的基本代码。
[C#] 纯文本查看 复制代码
    //抽象状态类 定义一个接口以封装与Context的一个特定状态相关的行为[/size]

[size=16px]
[/size]
[size=16px]    abstract class Strategy[/size]
[size=16px]    {[/size]
[size=16px]        abstract public void AlgorithmInterface();[/size]
[size=16px]    }[/size]
[size=16px]
[/size]
[size=16px]
[/size]
[size=16px]    class ConcreteStrategyA : Strategy[/size]
[size=16px]    {[/size]
[size=16px]        public override void AlgorithmInterface()[/size]
[size=16px]        {[/size]
[size=16px]            Console.WriteLine("算法接口实例A");[/size]
[size=16px]        }[/size]
[size=16px]    }[/size]
[size=16px]
[/size]
[size=16px]    class ConcreteStrategyB: Strategy[/size]
[size=16px]    {[/size]
[size=16px]        public override void AlgorithmInterface()[/size]
[size=16px]        {[/size]
[size=16px]            Console.WriteLine("算法接口实例B");[/size]
[size=16px]        }[/size]
[size=16px]    }[/size]
[size=16px]
[/size]
[size=16px]    class ConcreteStrategyC : Strategy[/size]
[size=16px]    {[/size]
[size=16px]        public override void AlgorithmInterface()[/size]
[size=16px]        {[/size]
[size=16px]            Console.WriteLine("算法接口实例C");[/size]
[size=16px]        }[/size]
[size=16px]    }[/size]
[size=16px]
[/size]
[size=16px]
[/size]
[size=16px]    class Context[/size]
[size=16px]    {[/size]
[size=16px]        Strategy strategy;[/size]
[size=16px]
[/size]
[size=16px]        public Context(Strategy strategy)[/size]
[size=16px]        {[/size]
[size=16px]            this.strategy = strategy;[/size]
[size=16px]        }[/size]
[size=16px]
[/size]
[size=16px]        public void ContextInterface()[/size]
[size=16px]        {[/size]
[size=16px]            strategy.AlgorithmInterface();[/size]
[size=16px]        }[/size]
[size=16px]    }[/size]

[size=16px]


首先写一个虚拟的策略类Strategy,里面有一个虚拟方法AlgorithmInterface,然后再写3个实体策略类ConcreteStrategyA,B,C 都继承父类Strategy,
然后重写AlgorithmInterface方法,各自输出各自的策略方法,最后在写一个Context内容类,里面包含有一个策略类的引用,ContextInterface方法用来调用自己引用的策略方法AlgorithmInterface() , 现在再来看看实现方法
[C#] 纯文本查看 复制代码
     Context c1=new Context(new ConcreteStrategyA());
            c1.ContextInterface();

            Context c2 = new Context(new ConcreteStrategyB());
            c2.ContextInterface();

            Context c3 = new Context(new ConcreteStrategyC());
            c3.ContextInterface();

x1.jpg

好了,原理搞清楚了,看到这里估计你也明白些什么了。这不就是状态模式的东西吗,楼主是不是没东西写了随便换个名字就拿来忽悠人了。对于说这种话的人我也是
呵呵了,怎么就猜的那么准呢[img=0,1]file:///C:\Users\fen\AppData\Roaming\Tencent\QQ\Temp\UT1[SF[LMP%ZZQMK9)6E6L2.jpg[/img] x2.jpg

好吧,开个小玩笑,其实不是这样的,状态模式和策略模式使用上看起来基本差不多,但还是分情况的,我也是看了大量资料才理解其中的区别,这个我们先保留意见,在做个小案例,我们再来说说其中的不同。
  我们玩CS的时候会有切换武器的操作,比如按1换主武器,2是副武器,3是小刀,4是手雷,我们就用策略模式来试着做下。

[C#] 纯文本查看 复制代码
    public interface IWeapons
    {
        void Play();
    }


    public class rifleWeapons : IWeapons
    {
        public void Play()
        {
            Console.WriteLine("使用步枪攻击远距离敌人");
        }
    }


    public class pistolWeapons : IWeapons
    {
        public void Play()
        {
            Console.WriteLine("使用手枪攻击中距离敌人");
        }
    }

    public class knifeWeapons : IWeapons
    {
        public void Play()
        {
            Console.WriteLine("使用刀子攻击远距离敌人");
        }
    }

    public class grenadesWeapons : IWeapons
    {
        public void Play()
        {
            Console.WriteLine("使用猴赛雷砸敌人");
        }
    }

    public class Player
    {
        private IWeapons weapons;

        public void SetWeapons(IWeapons w)
        {
            weapons = w;
        }

        public void Play()
        {
            weapons.Play();
        }
    }



首先我们先声明一个武器接口类IWeapons 里面有一个Play方法 然后在写4个子类,就是我们上面说的4种武器,rifleWeapons 主武器类,pistolWeapons副武器类,
knifeWeapons 小刀类,grenadesWeapons 手雷类,分别继承IWeapons并重写Play方法,输出自己的作用。然后是我们的Player类,里面管理我们的武器接口,
有个Play方法运行武器的Play方法。
最后来实现
[C#] 纯文本查看 复制代码
    IWeapons weapons = null;
            Player player=new Player();
            Console.WriteLine("---玩家发现远距离敌人---");
            weapons=new rifleWeapons();
            player.SetWeapons(weapons);
            player.Play();

            Console.WriteLine("---玩家发现中距离敌人---");
            weapons = new pistolWeapons();
            player.SetWeapons(weapons);
            player.Play();

            Console.WriteLine("---玩家发现近距离敌人---");
            weapons = new knifeWeapons();
            player.SetWeapons(weapons);
            player.Play();

            Console.WriteLine("---玩家发现敌人躲起来了---");
            weapons = new grenadesWeapons();
            player.SetWeapons(weapons);
            player.Play();


c2.jpg


结果都正常的输出了,可以看出 我们在调用的时候也是在武器new上我们需要的参数类,然后给到Player,在player下运行Play方法来运行我们不同的策略方法。
好,到这一步我们再来对比下和状态模式的区别,从逻辑上来说是状态模式注重的是内在的改变,而策略模式注重的是外在的改变,比如我们肚子饿了,想去吃饭,
是吃饭还是吃面包还是吃粉呢,这些食物就是外部的东西,我们没办法看到其内在也不关心,这个时候用策略模式,而当我们选好要吃的食物了,这个时候选择使用什么姿势来吃呢,是蹲着还是坐着,还是站着,这些都是涉及到自身环境的改变,而我们可以去控制的也关心内在的变化就可以用状态模式。




   策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
   在策略模式中,应当由客户端自己决定在什么情况下使用什么具体策略角色。2)
   策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。这在一定程度上提高了系统的灵活性,但是客户端需要理解所有具体策略类之间的区别,以便选择合适的算法,这也是策略模式的缺点之一,在一定程度上增加了客户端的使用难度。

工程提供了那么多次,可是每次下载的人数都寥寥无几,太伤心了,所以这次决定不发工程,有些东西你只有失去了才懂得珍惜,好在你永远不会失去,文章末尾还是有下载地址



策略模式.zip

37.97 KB, 下载次数: 21

售价: 1 蛮牛币  [记录]

评分

参与人数 2鲜花 +10 收起 理由
飞翔的小鸟 + 5 这个评分的难道是你的小号?
CloudHu + 5 很给力!

查看全部评分


回复

使用道具 举报

3偶尔光临
192/300
排名
8163
昨日变化
8

0

主题

45

帖子

192

积分

Rank: 3Rank: 3Rank: 3

UID
176961
好友
0
蛮牛币
301
威望
0
注册时间
2016-10-20
在线时间
37 小时
最后登录
2017-10-12
发表于 2016-12-14 09:18:33 | 显示全部楼层
Goooooooooooooooooooooooooooooooooooooooooooooooood

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1229/1500
排名
22304
昨日变化
21

10

主题

674

帖子

1229

积分

Rank: 6Rank: 6Rank: 6

UID
158776
好友
1
蛮牛币
53
威望
0
注册时间
2016-7-26
在线时间
531 小时
最后登录
2017-11-17
发表于 2016-12-14 10:01:31 | 显示全部楼层
谢谢楼主分享,辛苦了。

回复 支持 反对

使用道具 举报

2初来乍到
147/150
排名
8936
昨日变化
13

0

主题

9

帖子

147

积分

Rank: 2Rank: 2

UID
190171
好友
0
蛮牛币
307
威望
0
注册时间
2016-12-7
在线时间
42 小时
最后登录
2017-11-1
发表于 2016-12-15 06:49:17 | 显示全部楼层

谢谢楼主分享,辛苦了。

回复 支持 反对

使用道具 举报

3偶尔光临
214/300
排名
9668
昨日变化
7

0

主题

55

帖子

214

积分

Rank: 3Rank: 3Rank: 3

UID
116282
好友
0
蛮牛币
399
威望
0
注册时间
2015-8-2
在线时间
75 小时
最后登录
2017-10-9
发表于 2016-12-15 08:21:29 | 显示全部楼层
之前看过关于策略模式,再次看~~
[发帖际遇]: AILHC 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1252/1500
排名
1968
昨日变化
9

10

主题

87

帖子

1252

积分

Rank: 6Rank: 6Rank: 6

UID
103157
好友
1
蛮牛币
1234
威望
0
注册时间
2015-5-25
在线时间
591 小时
最后登录
2017-11-17

迈向小康

发表于 2016-12-15 09:08:55 | 显示全部楼层
瞎看一下

回复

使用道具 举报

2初来乍到
100/150
排名
23879
昨日变化
18

0

主题

39

帖子

100

积分

Rank: 2Rank: 2

UID
48985
好友
0
蛮牛币
27
威望
0
注册时间
2014-10-14
在线时间
49 小时
最后登录
2017-10-23
发表于 2016-12-15 16:56:18 | 显示全部楼层
{:95:}{:95:}{:95:}{:95:}{:95:}用一下再说

回复 支持 反对

使用道具 举报

4四处流浪
337/500
排名
7822
昨日变化
8

13

主题

98

帖子

337

积分

Rank: 4

UID
179609
好友
2
蛮牛币
779
威望
0
注册时间
2016-10-31
在线时间
92 小时
最后登录
2017-8-2
QQ
发表于 2016-12-15 22:52:42 | 显示全部楼层
楼主,强烈要求出书,我喜欢这模式

回复 支持 反对

使用道具 举报

3偶尔光临
273/300
排名
7575
昨日变化
4

0

主题

61

帖子

273

积分

Rank: 3Rank: 3Rank: 3

UID
161307
好友
2
蛮牛币
367
威望
0
注册时间
2016-8-9
在线时间
86 小时
最后登录
2017-4-27
发表于 2016-12-16 10:02:51 | 显示全部楼层
就喜欢看云图的设计模式,如果有些在Unity更具体实例就再好不过了

回复 支持 反对

使用道具 举报

排名
307
昨日变化

45

主题

375

帖子

4410

积分

Rank: 9Rank: 9Rank: 9

UID
42814
好友
35
蛮牛币
1568
威望
0
注册时间
2014-8-31
在线时间
1368 小时
最后登录
2017-11-18

专栏作家

QQ
 楼主| 发表于 2016-12-16 10:13:39 | 显示全部楼层
双耳只听圣贤书 发表于 2016-12-16 10:02
就喜欢看云图的设计模式,如果有些在Unity更具体实例就再好不过了

会有的 请关注q群信息

回复 支持 反对

使用道具 举报

7日久生情
1624/5000
排名
854
昨日变化
1

0

主题

164

帖子

1624

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
74072
好友
0
蛮牛币
2497
威望
0
注册时间
2015-2-10
在线时间
494 小时
最后登录
2017-11-17
发表于 2016-12-16 16:27:33 | 显示全部楼层


谢谢楼主分享,辛苦了。

回复 支持 反对

使用道具 举报

3偶尔光临
290/300
排名
7087
昨日变化
2

1

主题

58

帖子

290

积分

Rank: 3Rank: 3Rank: 3

UID
188989
好友
0
蛮牛币
443
威望
0
注册时间
2016-12-2
在线时间
93 小时
最后登录
2017-6-13
QQ
发表于 2016-12-16 19:49:22 | 显示全部楼层
楼主辛苦   学习了

回复 支持 反对

使用道具 举报

4四处流浪
403/500
排名
5820
昨日变化
4

0

主题

92

帖子

403

积分

Rank: 4

UID
168208
好友
0
蛮牛币
348
威望
0
注册时间
2016-9-12
在线时间
129 小时
最后登录
2017-7-9
发表于 2016-12-18 23:46:26 | 显示全部楼层
还要把 控制台模式转成unity 模式    沃德心好累。。。

回复 支持 反对

使用道具 举报

排名
307
昨日变化

45

主题

375

帖子

4410

积分

Rank: 9Rank: 9Rank: 9

UID
42814
好友
35
蛮牛币
1568
威望
0
注册时间
2014-8-31
在线时间
1368 小时
最后登录
2017-11-18

专栏作家

QQ
 楼主| 发表于 2016-12-19 00:32:36 | 显示全部楼层
MrSun 发表于 2016-12-18 23:46
还要把 控制台模式转成unity 模式    沃德心好累。。。

自己转到unity去 印象深刻

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表