大话设计模式学习了24个设计模式,学习这本书要了解每个模式所对应的故事是什么,看了UML图要知道它对应的代码是什么,现在介绍一下uml关系在代码中的表现形式。
继承定义父类和子类,其中子类继承父类的所有特性,而且子类还可以定义新的特性。子类拥有父类非private的属性和功能,子类可以扩展父类没有的属性和功能,子类还可以以自己的方式实现父类的功能(方法重写)
<span style="font-family:KaiTi_GB2312;font-size:18px;">class Animal //动物类作为父类 { protected string name; public Animal(string name)//名字属性 { this.name = name; } public void Reproduce()//定义父类的方法 { } } class Birds : Animal //鸟类作为子类,继承与动物类 { public Birds(string name) : base(name) { }//子类构造方法需要调用父类同样的参数类型的构造方法 public void Reproduce //子类继承父类的方法 { } public void Fly //子类的特有方法 { } } </span>
关联是一种“拥有”关系,指一个类需要“知道”另一个类的属性和方法。如企鹅和气候类,企鹅需要知道气候的变化,需要了解气候规律。
<span style="font-family:KaiTi_GB2312;font-size:18px;">class Climate //气候类 { public string climate; public string Climate { get { return climate; } set { climate = value; } } } class Penguin { Climate climate; //Penguin类中引用Climate public Penguin(Climate climate) { this.climate = climate; } public void migrate() { Console.WriteLine(""); } } </span>
实现是指接口和类之间的关系,是实现类实现接口的功能。
接口的表示方法有两种:矩形表示法和棒棒糖表示法。
以唐老鸭讲人话为例,实现代码如下:
<span style="font-family:KaiTi_GB2312;font-size:18px;">interface ILanguage //定义接口 { string Speak(); } class Donald Duck : ILanguage { public void Speak() { Console.WriteLine ("唐老鸭讲话"); } }</span>
聚合表示的是一种弱的“拥有”关系,体现的是A对象包含B对象,但B对象不是A对象的一部分。聚合关系用空心的菱形和实现箭头来表示。
聚合代码如下:
<span style="font-family:KaiTi_GB2312;font-size:18px;"> class Penguins { private Penguin penguin; //声明一个Penguin 对象 public Penguins(Penguin penguin) //通过构造方法,传入具体的对象penguin { this.penguin = penguin; } } class Penguin { }</span>
组合是一种强的拥有关系,是一种整体和部分的关系,部分和整体的生命周期一样。数字“1”和“2”称为基数。表明这一端的类可以有几个实例,一个鸟应该有两只翅膀。如果一个类可能有无数个实例,则用“n”来表示。关联关系、聚合关系也可以有基数。这让我想到了实体图里面的1:M,1:N,和M:N
组合关系对应的代码
class Bird { private Wing wing; //声明一个Wing对象 public Bird() { wing=new Wing(); //在Bird类中,初始化时,实例化翅膀Wing,它们之间同时生成 } }
动物会新陈代谢,能繁殖,动物要生存需要水和氧气等,动物要依赖于氧气和水。
abstract class Animal { public Metabolism (Osygen oxygen,Water water) //氧气和水作为参数 } class Oxygen //氧气类 { } class Water //水类 { }
每一个模式都会有UML图,代码就是根据图写出的,了解这些关系非常重要,而熟悉掌握这些需要我们多看多用。