1.设计模式入门(Head First 设计模式复习笔记)

本文通过鸭子游戏和角色战斗游戏两个实例介绍了策略模式的应用。通过定义一组算法并将它们封装起来,使得可以在运行时自由切换,展示了如何使算法独立于使用它的客户端。

一、设计原则

  1. 找出应用中可能变化的,把他们独立起来不要和那些不需要独立的代码混在一起。
  2. 针对接口编程,而不是针对实现编程
  3. 多用组合,少用继承

二、策略模式

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

 

三、模拟鸭子应用

  需求:上班的公司要求模拟一个鸭子Duck的游戏,鸭子已知的有MallHardDuck、ReadHeadDuck、RubberDuck等(以后可能加入DecoyDuck

 

),鸭子都有display、swim、有的鸭子会fly,各种鸭子quack不同。后期橡皮鸭也可能加上飞翔,或者改变其飞翔方法。

 

  策略模式实现:

1.1关系图(实际名称为准)

 

 

 1 public interface IFlyBehavior
 2 {
 3     void fly();
 4 }
 5 
 6 public class FlyWithWings : IFlyBehavior
 7 {
 8     public void fly()
 9     {
10         Console.WriteLine("duck normal fly");
11     }
12 }
13 
14 public class FlyNoWay : IFlyBehavior
15 {
16     public void fly()
17     {
18         Console.WriteLine("duck no fly");
19     }
20 }
21 
22 public interface IQuackBehavior
23 {
24     void quack();
25 }
26 
27 public class Quack : IQuackBehavior
28 {
29     public void quack()
30     {
31         Console.WriteLine("duck normal quack guagua");
32     }
33 }
34 
35 public class Squeack : IQuackBehavior
36 {
37     public void quack()
38     {
39         Console.WriteLine("duck normal quack zhizhi");
40     }
41 }
42 
43 public class MuteQuack : IQuackBehavior
44 {
45     public void quack()
46     {
47         Console.WriteLine("duck no quack");
48     }
49 }
50 
51 public abstract class Duck
52 {
53     public IFlyBehavior flyBehavior;
54     public IQuackBehavior quackBehavior;
55 
56     public abstract void Display();
57     public abstract void Swim();
58 
59     public void perFormFly() {
60         flyBehavior.fly();
61     }
62 
63     public void perFormQuack() {
64         quackBehavior.quack();
65     }
66 
67     public void setFlyBehavior(IFlyBehavior iflyable) {
68         flyBehavior = iflyable;
69     }
70 
71     public void setQuackBehavior(IQuackBehavior iquackable) {
72         quackBehavior = iquackable;
73     }
74 }

 

 1 public class MallHardDuck : Duck
 2 {
 3     public MallHardDuck()
 4     {
 5         flyBehavior = new FlyWithWings();
 6         quackBehavior = new Quack();
 7     }
 8     public override void Display()
 9     {
10         Console.WriteLine("Display-MallHardDuck");
11     }
12 
13     public override void Swim()
14     {
15         Console.WriteLine("Swim-MallHardDuck");
16     }
17 }
18 
19 public class ReadHeadDuck: Duck
20 {
21     public ReadHeadDuck() {
22         flyBehavior = new FlyWithWings();
23         quackBehavior = new Squeak();
24     }
25 
26     public override void Display()
27     {
28         Console.WriteLine("Display-ReadHeadDuck");
29     }
30 
31     public override void Swim()
32     {
33         Console.WriteLine("Swim-ReadHeadDuck");
34     }
35 }
36 
37 public class RubberDuck : Duck
38 {
39     public RubberDuck() {
40         flyBehavior = new FlyNoWay();
41         quackBehavior = new NoQuack();
42     }
43 
44     public override void Display()
45     {
46         Console.WriteLine("Display-RubberDuck");
47     }
48 
49     public override void Swim()
50     {
51         Console.WriteLine("Swim-RubberDuck");
52     }
53 }

 

1 public class RockFly : IFlyBehavior
2     {
3         public void fly()
4         {
5             Console.WriteLine("dock flly by rock");
6         }
7     }

 

 1 class Program
 2 {
 3     static void Main(string[] args)
 4     {
 5         Console.WriteLine("生产一个MallHardDuck:");
 6         Duck mallHardDuck = new MallHardDuck();
 7         mallHardDuck.Display();
 8         mallHardDuck.Swim();
 9         mallHardDuck.perFormFly();
10         mallHardDuck.perFormQuack();
11 
12         Console.WriteLine("生产一个ReadHeadDuck:");
13         Duck readHeadDuck = new ReadHeadDuck();
14         readHeadDuck.Display();
15         readHeadDuck.Swim();
16         readHeadDuck.perFormFly();
17         readHeadDuck.perFormQuack();
18 
19         Console.WriteLine("生产一个RubberDuck:");
20         Duck rubberdDuck = new RubberDuck();
21         rubberdDuck.Display();
22         rubberdDuck.Swim();
23         rubberdDuck.perFormFly();
24         rubberdDuck.perFormQuack();
25         Console.WriteLine("为RubberDuck加一个飞行器:");
26         rubberdDuck.setFlyBehavior(new RockFly());
27         rubberdDuck.perFormFly();
28         Console.WriteLine("让RubberDuck正常发声:");
29         rubberdDuck.setQuackBehavior(new Quack());
30         Console.Read();
31     }
32 }

 

三、练习:

设计一个游戏,角色有Queen、King、Troll、Knight,他们可以使用武器KnifeBehavior、BowAndArrowBehavior、AxeBehavior、SwordBehavior,游戏中各个角色都可以更换新的武器道具。

  1 public interface IWeaponBehavior
  2 {
  3     void useWeapon();
  4 }
  5 
  6 public class KnifeBehavior : IWeaponBehavior
  7 {
  8     public void useWeapon()
  9     {
 10         Console.WriteLine("use Weapon Knife ");
 11     }
 12 }
 13 
 14 public class BowAndArrowBehavior : IWeaponBehavior
 15 {
 16     public void useWeapon()
 17     {
 18         Console.WriteLine("use Weapon BowAndArrow ");
 19     }
 20 }
 21 
 22 public class AxeBehavior : IWeaponBehavior
 23 {
 24     public void useWeapon()
 25     {
 26         Console.WriteLine("use Weapon Axe ");
 27     }
 28 }
 29 
 30 public class SwordBehavior : IWeaponBehavior
 31 {
 32     public void useWeapon()
 33     {
 34         Console.WriteLine("use Weapon Sword ");
 35     }
 36 }
 37 
 38 public class Character
 39 {
 40     public IWeaponBehavior weaponBehavior;
 41     public void fight() {
 42         weaponBehavior.useWeapon();
 43     }
 44 
 45     public void setWeapon(IWeaponBehavior _weaponBehavior) {
 46         weaponBehavior = _weaponBehavior;
 47     }
 48 }
 49 
 50 public class Queen : Character
 51 {
 52     public Queen() {
 53         weaponBehavior = new KnifeBehavior();
 54     }
 55 }
 56 public class King : Character
 57 {
 58     public King()
 59     {
 60         weaponBehavior = new BowAndArrowBehavior();
 61     }
 62 }
 63 public class Troll : Character
 64 {
 65     public Troll()
 66     {
 67         weaponBehavior = new AxeBehavior();
 68     }
 69 }
 70 public class Knight : Character
 71 {
 72     public Knight()
 73     {
 74         weaponBehavior = new SwordBehavior();
 75     }
 76 }
 77 
 78 class Program
 79     {
 80         static void Main(string[] args)
 81         {
 82             Console.WriteLine("创建一个Queen:");
 83             Character Queen = new Queen();
 84             Queen.fight();
 85 
 86             Console.WriteLine("创建一个King:");
 87             Character King = new King();
 88             King.fight();
 89 
 90             Console.WriteLine("创建一个Troll:");
 91             Character Troll = new Troll();
 92             Troll.fight();
 93 
 94             Console.WriteLine("创建一个Knight:");
 95             Character Knight = new Knight();
 96             Knight.fight();
 97             Console.WriteLine("Knight使用了新武器BowAndArrowBehavior:");
 98             Knight.setWeapon(new BowAndArrowBehavior());
 99             Knight.fight();
100             Console.Read();
101         }
102     }

 

转载于:https://www.cnblogs.com/zyblogs/p/7827295.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值