设计模式基础总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenhaiming123/article/details/82918869

一、回顾面向对象的内容
UML中的关联、依赖、泛化 、 实现 >、组合 、聚合 的关系和表示方法 博客链接,欢迎访问和回顾
二、进一步学习
设计模式
1)类与实例
对象是一个自包含的实体,用一组可识别的特性和行为来标识。类就是具有相同的属性和功能的对象的抽象的集合。

  1. 类名称首字母要大写,多个单词则各个首字母大写
  2. 对外公开的方法需要用‘public’修饰符
  3. 实例就是一个真实的对象。实例化就是创建对象的过程
    类
    实例化

2)构造方法
又叫构造函数,其实就是对类进行初始化。构造方法与类同名,无返回值,也不需要void,在new时候调用。所有类都有构造方法,如果你不编码则系统默认生成空的构造方法,若你定义则默认的构造方法失效。如:public Cat (string name)//定义Cat类的构造方法,参数是输入一个字符串。在这里插入图片描述
3)方法重载
方法重载提供了创建同名的多个方法的能力,但这些方法需要使用不同的参数类型。注意并不是只有构造方法可以重载,普通方法也可以重载的。方法重载时,两个方法必须有方法名相同,但参数类型或个数必须要有所不同,否则重载就没有意义了。方法重载可在不改变原方法的基础上,新增功能。
在这里插入图片描述
4)属性和修饰符
属性
private表示只允许用一个类中的成员访问,其他类包括它的子类无法访问,私有的。如果类中的成员没有加修饰符,则被认为是private。通常字段都是private,即私有的变量,而属性都是public,即公有的变量。get访问器返回与声明的属性相同的数据类型,表示的意思是调用时可以得到内部字段的值或引用,即读;set访问器没有显式设置参数,但它有一个隐式参数,用关键字value表示,它的作用是调用属性时可以给内部的字段或引用赋值,即“写”。可以不写set,则get表示只读。变量私有的叫字段,公有的是属性。
5)封装(Encapsulation)
每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。 隐藏对象的具体实现细节,通过共有方法暴露对象的功能。内部结构可以自由修改,同时可对成员进行更加精确的控制 (比如在setter方法中加值合法判断)。好处:1.良好的封装能够减少耦合。2.类内部的实现可以自由修改,3.类具有清晰的对外接口。

6)继承(Inheritance)
对象的继承代表了一种‘is-a’的关系,如果两个对象A和B,可以描述‘B是A’,则表明B可以继承A。继承除了具备被继承者的特性外,还具备自己独有的个性。简化:使用已经存在的类作为基础类(父类),在此基础上建立新类(子类), 子类既可复用父类的功能,也能进行扩展,从而实现代码复用。继承的工作方式:定义父类和子类,或叫做基类和派生类,其中子类继承父类的所有特性,子类不但继承了父类的所有特性,还可以定义新的特性。注意:子类拥有非private的属性和功能。protected表示继承时子类可以对基类有完全访问权,也就是说,用protected修饰的类成员,对子类公开,但不对其他类公开。 另外,Java不能像C++那样同时继承多个父类,只能树形的继承, 比如:Man -> Human -> Animal,或通过接口和内部类实现多继承。在C#中,子类从它的父类中继承的成员有方法、域、属性、事件、索引指示器,但对于构造方法,它不能被继承,只能被调用。对于调用父类的成员,可以用base关键字。
另外,关于继承还需注意以下几点:
1.子类拥有父类非private的属性与方法
2.构造方法只能调用,不能实现,子类默认调用父类的无参构造方法,
如果父类没有无参的构造方法,需要使用super显式调用!
3.慎用继承,要考虑是否需要从子类向父类进行向上转型!父类变,则子类不得不变
4.继承会破坏包装,父类实现细节暴露给子类,这增大两个类之间的耦合性。

7)多态(Polymorphism)

定义:一个类实例的相同方法在不同的情形下有不同的表现形式。多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。注意:子类以父类的身份出现时,子类特有的属性和方法不可以使用。
为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的。这是通过该该成员的返回类型之前添加virtual关键字来实现。字段不能虚拟。方法、属性、事件、索引器都可以虚拟。虚方法有方法体,可以实际做些事情。子类使用override关键字,将父类实现替换为它自己的实现,这就是方法重写Override,或者叫做方法覆写。

分为以下两种:
编译时多态(OverLoading)—— 方法重载
运行时多态(OverRidding)—— 继承 + 方法重写 + 向上转型(父类引用指向子类对象)
运行时多态(动态绑定,new后面什么类型,动态类型就是什么类型)

8)重构
9)抽象类
C#允许把类和方法声明为abstract,即抽象类和抽象方法。
第一,抽象类不能实例化;第二,抽象方法是必须被子类重写的方法;第三,如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否包含其他一般方法。
在一个以继承关系形成的等级结构里面,树叶节点应当是具体类,而树枝节点均应当是抽象类。

10)接口
接口把隐士公共方法和属性组合起来,来封装特定功能的一个集合;通过接口可以支持所指定的所有属性和成员;
接口用interface声明,接口名称前要加”I”;
接口是对行为的抽象
11)集合
用于存储和检索的专用类;
数组优点:数组在内存中连续存储,快速而容易的从头到尾遍历元素,快速修改元素;
装箱:值类型打包到Object引用类型的一个实例中;
整型变量i赋值给对象o;

  1. 装箱在值类型向引用类型转换时发生
  2. 拆箱在引用类型向值类型转换时发生
  3. 值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用。
      值类型有: byte,short,int,long,float,double,decimal,char,bool struct ,结构体(struct),枚举(enum)
        引用类型有: 数组, 类(class), 接口,委托,字符串(string)
        值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。引用类型的对象总是在进程堆中分配(动态分配)
    相同点:
    引用类型可以实现接口,值类型当中的结构体也可以实现接口;
    引用类型和值类型都继承自System.Object类。
    a.范围方面
    值类型包括:结构体(数值类型、bool型、用户定义的结构体),枚举,可空类型。
    引用类型包括:数组,用户定义的类、接口、委托,object,字符串(string),用户定义的结构体,可空类型
    b.内存分配方面:
    数组的元素不管是引用类型还是值类型,都存储在托管堆上。
    引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。简称引用类型部署在托管推上。而值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量存储;作为局部变量时,存储在栈上。
    c.适用场合:
    值类型在内存管理方面具有更好的效率,并且不支持多态,适合用做存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。
    引用类型可以派生出新的类型,而值类型不能,因为所有的值类型都是密封的;
    引用类型可以包含null值,值类型不能;
    引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。

int i=123;
object o = (object) i;//boxing
拆箱:从对象中提取值类型;
对象o拆箱并赋值给整型变量i

o = 123;
i = (int) o;//unboxing
12)泛型
泛型是具有占位符的类、结构、接口和方法;
13)委托与事件
委托是对函数的封装,给方法的特征指定一个名称,事件是委托的一种特殊形式;
委托是一种引用方法的类型,为委托分配了方法,委托将与该方法具有完全相同行为;

猜你喜欢

转载自blog.csdn.net/chenhaiming123/article/details/82918869