您的位置:首页 > 其它

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

2017-11-14 17:04 459 查看
一、设计原则

找出应用中可能变化的,把他们独立起来不要和那些不需要独立的代码混在一起。

针对接口编程,而不是针对实现编程

多用组合,少用继承

二、策略模式

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

三、模拟鸭子应用

  需求:上班的公司要求模拟一个鸭子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     }


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: