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

扫一扫,访问微社区

开发者专栏

关注:1702

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

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

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

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

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

43

主题

354

帖子

4042

积分

Rank: 9Rank: 9Rank: 9

UID
42814
好友
32
蛮牛币
6073
威望
0
注册时间
2014-8-31
在线时间
1251 小时
最后登录
2017-5-27

专栏作家

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偶尔光临
190/300
排名
7481
昨日变化
1

0

主题

45

帖子

190

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

5熟悉之中
843/1000
排名
23000
昨日变化
12

10

主题

483

帖子

843

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

2初来乍到
119/150
排名
8832
昨日变化
1

0

主题

9

帖子

119

积分

Rank: 2Rank: 2

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

谢谢楼主分享,辛苦了。

回复 支持 反对

使用道具 举报

3偶尔光临
182/300
排名
9615
昨日变化
137

0

主题

51

帖子

182

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

5熟悉之中
705/1000
排名
3291
昨日变化

4

主题

58

帖子

705

积分

Rank: 5Rank: 5

UID
103157
好友
1
蛮牛币
643
威望
0
注册时间
2015-5-25
在线时间
331 小时
最后登录
2017-5-27
发表于 2016-12-15 09:08:55 | 显示全部楼层
瞎看一下

回复

使用道具 举报

排名
23000
昨日变化
12

0

主题

37

帖子

86

积分

Rank: 2Rank: 2

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

回复 支持 反对

使用道具 举报

4四处流浪
342/500
排名
7079
昨日变化
1

16

主题

105

帖子

342

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

3偶尔光临
272/300
排名
6872
昨日变化
1

0

主题

62

帖子

272

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

排名
337
昨日变化

43

主题

354

帖子

4042

积分

Rank: 9Rank: 9Rank: 9

UID
42814
好友
32
蛮牛币
6073
威望
0
注册时间
2014-8-31
在线时间
1251 小时
最后登录
2017-5-27

专栏作家

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

会有的 请关注q群信息

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1286/1500
排名
1146
昨日变化

0

主题

141

帖子

1286

积分

Rank: 6Rank: 6Rank: 6

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


谢谢楼主分享,辛苦了。

回复 支持 反对

使用道具 举报

3偶尔光临
267/300
排名
6948
昨日变化
1

1

主题

57

帖子

267

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

4四处流浪
373/500
排名
5724
昨日变化
48

0

主题

89

帖子

373

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

排名
337
昨日变化

43

主题

354

帖子

4042

积分

Rank: 9Rank: 9Rank: 9

UID
42814
好友
32
蛮牛币
6073
威望
0
注册时间
2014-8-31
在线时间
1251 小时
最后登录
2017-5-27

专栏作家

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

自己转到unity去 印象深刻

回复 支持 反对

使用道具 举报

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

本版积分规则

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