【前言】
设计模式这个项目,也拖了挺长时间了。前段时间自考,都是在断断续续地学习设计模式,感觉很不好,现在自考完了,终于可以系统地学习一下设计模式了。下面是我对设计模式的初步总结。
【内容】
1.什么是设计模式
设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
是软件开发人员在软件开发过程中面临的一般问题的解决方案,这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
说白了,就是在编程中,要做一个系统,首先要分成几个模块,实现不同的功能,而不是一上来没有目的的直接写代码;所以设计模式可以理解为是一种策略,一个方案,使代码的编写真正工程化。设计模式就是软件工程的基石脉络,就像大厦的结构一样。
2.类与实例
在学习类之前,有必要学习一下对象是什么:
对象
一切事物皆对象,即所有的东西都是对象,对象就是可以看到、感觉到、听到、触摸到、尝到、或闻到的东西。
是一个自包含的实体,用一组可识别的特性和行为来标识。
个人理解:对象就是一个实体,比如说:那只小花猫、小明同学等,这种特指的都称为对象。
类
是具有相同属性和功能的对象的抽象的集合。
个人理解:类是一个很抽象的概念,比如:人类、动物,这些就是类,是对对象的一个总体概括,是对对象的抽象。
类和对象的联系与区别
类是抽象的概念,仅仅是模板;
类是不占内存的,对象占内存。
类是对象的抽象,而对象是类的具体实例;
举例:动物运动会
class Cat
{
public string Shout()
{
return “喵”;
}
}
现在问题来了,有了这个类,如何去应用呢?这时候需要实例化这个类。
实例
一个真实的对象,比如你和我,就是‘人’类的实例。
实例化
就是创建对象的过程,使用new关键字来创建。
Private void button1_click(object sender,EventArgs e)
{
Cat cat = new Cat();
MessageBox.Show(cat.Shout());
}
其中,
Cat cat:声明了一个Cat的对象,对象名为cat。
cat = new Cat():将此cat对象实例化。
3.构造方法
构造方法,又称构造函数,其实就是对类进行初始化。构造方法与类同名,无返回值,也不需要void,在new时候调用。
所有类都有构造方法,如果你不编码则系统默认生成空的构造方法,若有定义的构造方法,那么默认的构造方法就会失效了。
个人理解:构造方法其实就是构造出一个类的实例,对构造出来的一个类的实例进行初始化。比如说我想每个小猫一诞生就有姓名,我应该怎么做呢?首先猫是一个抽象的类,每个无名小猫是这个类的实例,而一诞生就有姓名就需要对每个无名小猫进行初始化,让每个小猫一出生就行姓名。
举例:
猫类
class Cat
{
private string name = “”;
public Cat( string name) //构造方法 与类同名 无返回值 不需要void
{
this.name = name;
}
public string Shout()
{
return “我的名字叫”+ name +”喵”;
}
}
客户端
private void button1_Click(object sender, EventArgs e)
{
Cat cat = new Cat(“咪咪”);
MessageBox.Show(cat.Shout());
}
4.方法重载
方法重载提供了创建同名的多个方法的能力,但这些方法需要使用不同的参数类型。
在方法重载时,两个方法必须要方法名相同,但参数类型或个数必须要有所不同。
方法重载可在不改变原方法的基础上,新增功能。任何方法都是可以重载的。
方法重载是提供了函数可扩展的能力。
个人理解:方法重载就是相同的方法名有不同的参数,从而达到了扩展的目的。比如说有些小猫刚出来,还没有名字,但也有部分小猫有名字了,这个时候就需要方法的重载。
举例:
class Cat
{
private string name = “”;
public Cat( string name) //方法重载 方法名必须相同 参数类型或个数必须有所不同
{
this.name = name;
}
public Cat( )
{
this.name = “无名”;
}
public string Shout()
{
return “我的名字叫”+ name +”喵”;
}
}
5.属性与修饰符
属性
是一个方法或一对方法,但在调用它的代码看来,它是一个字段,即属性适合于以字段的方式使用方法调用的场合。
字段是存储类要满足其设计所需要的数据,字段是与类相关的变量。
Private int shoutNum = 3;
Public int ShoutNum
{
get { return shoutNum; } //外界调用时可以得到shoutNum的值
set { shoutNum = value; } //外界可以给内部的shoutNum赋值
}
修饰符
修饰符 | 级别 | 适用成员 | 解释 |
Public | 公开 | 类及类成员的修饰符 | 对访问成员没有级别限制 |
Private | 私有 | 类成员的修饰符 | 只能在类的内部访问 |
Protected | 受保护的 | 类成员的修饰符 | 在类的内部或者派生类中访问,不管该类和派生类是不是在同一个程序集中 |
6.封装
封装:每个对象都包含它能进行操作所需要的所有信息,因此对象不必依赖其他对象来完成自己的操作。
个人理解:一个对象本身的所有操作,都放到本身的类中,便是封装。
封装的好处:
(1)良好的封装能够减少耦合
(2)类内部的实现可以自由地修改
(3)类具有清晰的对外接口
举例:
class Dog
{
private string name = “”;
public Dog( string name)
{
this.name = name;
}
public string Shout()
{
return “我的名字叫”+ name +”汪”;
}
}
客户端
private void button1_Click(object sender, EventArgs e)
{
Cat dog = new Dog(“旺财”);
MessageBox.Show(cat.Shout());
}
其中,Cat和Dog中有非常类似的代码。
可以用面向对象中的第二大特性‘继承’。
7.继承
对象的继承代表了一种‘is-a’的关系,如果两个对象A和B,可以描述为“B是A”,则表明B可以继承A。并且继承者除了具备被继承者的特性外,还具备自己独有的个性。
如果子类继承于父类,
(1)子类拥有父类非private的属性和功能
(2)子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能
(3)子类还可以以自己的方式实现父类的功能(方法重写)。
其中,对于构造方法,它不能被继承,只能被调用。在调用父类的成员时,可以用base关键字。
例如:
public Cat( ) : base( )
{ }
继承的缺点:父类变,子类不得不变。
8.多态
多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。
比如:小猫和小狗叫声比赛,同样是叫声,但是他们有各自的方式来发出叫声。
虚方法和重写
为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的。
而子类可以选择使用override关键字,将父类实现替换为它自己的实现。
父类
class Animal
{
……;
public virtual string Shout()
{
……;
}
}
子类
class Cat : Animal
{
public override string Shout()
{
……;
}
}
9.重构
重构,就是通过调整程序代码改善软件的质量、性能,改善既有代码的设计,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。
重构,不改变系统的外部功能,只对内部的结构进行重新的整理;可以降低项目的耦合度,使项目更加模块化,有利于项目的开发效率和后期的维护。
个人理解:比如你的卧室目前摆设很乱,家具摆放的很不合理,导致你的活动空间很小,所以你想重新设置一下你的房间里的家具如何摆放,你需要把家具搬出去,重新摆放,便是重构。
10.抽象类
在C#中,把类和方法声明为abstract,即抽象类和抽象方法。
抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的,所以,在一个以继承关系形成的等级结构里面,树叶节点应当是具体类,而树枝节点应当是抽象类。
抽象方法:没有方法体。
注意:
(1)抽象类不能实例化
(2)抽象方法是必须被子类重写的方法
(3)如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法。
11.接口
接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一旦实现了这个接口,类就可以支持接口所指定的所有属性和成员。实现接口的类就必须要实现接口中的所有方法和属性。一个类可以支持多个接口,多个类也可以支持相同的接口。
个人理解:接口就是对一种行为进行的抽象,比如说飞机、麻雀、超人是三个不同的类,但是有一个共同的行为“飞行”,这个时候可以让它们实现相同的接口来达到我们设计的目的。
12.委托与事件
委托
委托是对函数的封装,可以当做给方法的特征指定一个名称。
委托是一个类,它定义了方法的类型,是一种调用回调方法,使得可以将方法当做另一个方法的参数来进行传递,这种方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else语句,同时使得程序具有更好的可扩展性。
事件
事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。
事件是在发生其他类或对象关注的事情时,类或对象可通过事件通知它们。
比如Button按钮,当点击时,就会触发Click事件。
这是我对设计模式的初步总结,有些知识可能理解的还不是很好,欢迎大家指点!非常感谢!