首页 > 代码库 > 一步步学习设计模式系列之你必须要了解的概念和UML工具(一)

一步步学习设计模式系列之你必须要了解的概念和UML工具(一)

一、为什么要学习设计模式

使用设计模式的根本原因是为了保持类之间的隔离,防止相互之间了解太多内容;另一个重要的原因是,使用设计模式可以帮助我们避免重复开发。有很多策略能让程序员达到分离类的目的,其中包括封装和继承。一个继承父类的类能访问父类中所有非私有的的东西,如果以一个功能完整的类来继承层次结构,可能会过多的限制自己,也会给特定方法的实现带来累赘。因此设计模式建议应遵循以下原则面向接口编程,而不是针对实现编程优先使用对象组合,而不是继承。

(1)面向接口编程,而不是针对实现编程概述:

就是在任何类层次结构的顶端定义的是一个抽象类或一个接口,它没有实现方法,但定义了该类所需要支持的方法,这样在所有的派生类中可以自由实现这些方法,能最大限度的满足你的要求。

(2)优先使用对象组合,而不是继承概述:

这是一种可包含其他对象的对象结构,即把几个对象封装在一个对象中,我们一般会使用继承的方式,而随着你编写比较复杂的程序的时候,你会发现使用对象组合的优点。

二、老生常谈之C#基础知识

(1)virtual和override

如果基类中有一个方法,而想在派生类中覆盖它,而应该把基类中的方法声明为virtual,它的含义是,让派生类中具有同样函数签名的方法覆盖基类中发方法,而后在派生类中使用override关键字重写基类中的方法。

(2)使用new替换方法

当不能把基类中的方法声明为virtual时,另一种取代基类中的方法是,使用new 关键字,这样做能隐藏基类中同名的方法(与参数无关)。

代码示例:

public class Person
    {
        public virtual void  SayHello()
        {
            Console.WriteLine("我是地球人");
        }
        public void ChiHeLaSaShui()
        {
            Console.WriteLine("吃喝拉撒睡是每个人都会的技能!");
        }
    }
public class Chinese : Person
    {
        public override void SayHello()
        {
            Console.WriteLine("我是中国人,你好!");
        }
        public new  void ChiHeLaSaShui()
        {
            Console.WriteLine("中国人讲究美食");
        }
    }

(3)接口

接口本质上是一个规定,即所有实现该接口的类,都要实现接口中定义的方法。

(4)抽象类

抽象类声明了一个或对个没有实现的方法,如果把一个方法声明为抽象方法,则需要把类也声明为抽象类。

(5)UML(Unified Modeling Language) 统一建模语言

为什么要建模:建模是为了能够更好地理解正在开发的系统

通过建模达到下面的目的
1、模型有助于按照实际情况或按照所需的样式对系统进行可视化
2、模型能够规约系统的结构或行为
3、模型给出了构造系统的模板
4、模型对做出的决策进行文档化

对于一个复杂的系统,如银行、电信系统建模的重要性就越大。如果不能很好的理解一个复杂系统,盲目开发,失败的可能性很大。

什么是UML:统一建模语言(Unified Modeling Language , UML) 是一种绘制软件蓝图的标准语言,可以用UML对软件密集的制品进行可视化、详述、构造和文档化。

1、可视化:清晰的模型有利于交流
2、详述:可以使用uml对分析、设计、实现等决策进行详细描述
3、构造:把uml描述映射成编程语言
4、文档化:系统的所有细节都可以是uml进行描述。如:项目计划、发布活动等

类的UML表示:

一群对象(object)享有相同的结构、行为、约束和语义时,称它们是同类(class)的对象。换句话说,定义一个类就相当于描述了一群对象。在类中, 使用属性(attribute)表达对象的结构, 使用操作(operation)表达对象的行为。

技术分享

技术分享

UML预设了四种可见性,分别为公开(public)、私有(private)、保护

(protected)、包(package) 减号(-)为私有可见性,加号(+)为公开可见性,#表示受保护的,静态方法带有下划线,抽象方法写成斜体或带有{abstract}标签。

技术分享技术分享

在UML中抽象类与普通类是同一个类图表示,只是抽象类名字会变成斜体。

UML中的关系表示:

关系是事物之间的联系,在面向对象的建模中,有三种重要的关系是依赖、泛化、关联

1)依赖(Dependency)

依赖是一种使用关系,一个事物使用另一个事物。在图形上,把依赖画成一条有方向的虚线,指向被依赖的事物。如果被使用的类发生变化,那么另一个类的操作必然受影响。

2)泛化(Generalization)

在泛化关系中,子类继承了父类的行为和含义,子类也可以增加新的行为和含义或覆盖父类中的行为和含义。在图形上,在泛化画成一个带有空心三角行指向父类。

技术分享

在.Net里面泛化就是继承关系。

3)关联(Association)

关联是一种结构关系,它指明一个对象与另一个对象间的关系。

技术分享

classA和classB相关联

相互关联体现的是两个类、或者 类与接口之间语义级别的一种强依赖关系,是一种长期的稳定的关系;表现在代码层面,为被关联类以类属性的形式出现在关联类中,也可能是关联类引用了一个类型为被关联类的全局变量。

单向关联:

技术分享

ClassA关联于ClassB

单向关联表现在代码层面,为被关联类B以类属性的形式出现在关联类 A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;

聚合关系(Aggregation)

技术分享

聚合是关联关系的一种特例,他体现的是整体与部分拥有的关系。此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如汽车与发动机;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

组合关系(Composition)

技术分享

组合也是关联关系的一种特例,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;孕妇死了胎儿自然也就死了;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

关联关系的多重性

技术分享

不建议使用双向关联. 关联有两个端点, 在每个端点可以有一个基数, 表示这个关联的类可以有几个实例.
常见的基数及含义

  • 0..1:0 或1 个实例.
  • 0..*: 对实例的数目没有限制.
  • 1: 只能有一个实例.
  • 1..*: 至少有一个实例.

接口

技术分享

接口(interface)如同契约,负责的类必须负责实现它的公开操作,以及负责维护它的公开属性。

案例:

技术分享

好了,UML就简单介绍到这里,后面的文章会一一详细介绍23种设计模式。讲的不好,希望大神们多多指教,相互学习,共同进步。

最后,附上UML工具:链接:http://pan.baidu.com/s/1nva43c1 密码:v65t

至于如何破解,我就不告诉你了,自己到网上搜。

 

一步步学习设计模式系列之你必须要了解的概念和UML工具(一)