设计模式定义:
设计模式是从许多优秀的软件系统中总结出成功的可服用的设计方案
面向对象的几个原则:
面向抽象原则
1 抽象类与接口
接口和对象都不能创建对象 实例(new),但可以使用他们子类赋值给他们的引用。对于抽象类来说是使用上转型对象 接口叫接口回调
抽象类中抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public
而接口必须是public的 定义的常量或者抽象函数。
如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类
抽象类其他方面与其他类没有区别
接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法
接口与抽象类区别如下:
1抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2 面向抽象
开-闭原则
多用组合少用继承原则
继承优点:
子类通过重写父类的方法,即易于修改或扩展那些被复用的方法。
缺点:1 无法在运行期间改变父类继承的方法的行为,因为子类从父类继承的方法的行为在编译时就确定下来了
2 子类与父类的关系是强耦合关系,也就是说父类的方法的行为修改时,必然导致子类发生变化。
3 通过继承进行复用也称为“白盒”复用,父类的内部细节对于子类来说是透明的。
组合:
一个类把其他类的对象作为自己的成员变量,即在一个类中有其他类对象的定义。
优点:1 那个类对象对应它所在的类中是不透名的。
2 它们是弱耦合关系,那个类对象的方法行为或者属性发生变化,不影响它所在的类
3 类对象所在的类可以在运行的时候动态调用它
缺点:1 容易导致一个类中或者系统中对象过多,不容易维护
高内聚-低耦合原则
高内聚:是对软件系统中元素职责相关性和集中度的度量。如果元素具有高度相关的职责,除了这些职责内的任务,没有其它过多的工作,那么该元素就具有高内聚性,反之则为低内聚性。高内聚要求软件系统中的各个元素具有较高的协作性,因为在我们在完成软件需求中的一个功能,可能需要做各种事情,但是具有高内聚性的一个元素,只完成它职责内的事情,而把那些不在它职责内的事情拿去请求别人来完成。
低耦合:一个类中少用其他类的实例引用(new出来的类)
总的来说就是使代码具有可读性、重复性(函数复用、对象复用、组件复用)、易维护性、易更改性
UML类图
图表示:public + protected # private - 图分三层,第一层类名接口名 第二层 字段 第三层 方法 如
Student 《interface》
person
+name:String
#age:int
-money:double
+setName(String):void
类图之间的关系
泛化关系(继承关系) 用
关联关系(A类中的成员变量是用B类或者接口来声明的变量)
依赖关系:A类中的某个方法的参数是用B类或者接口声明的变量或者某个方法返回的数据类型是B类型的。
实现关系:一个类实现了一个接口
注释:
常用模式
单例模式
定义:一个类中只有一个对象
实现:
1 把构造函数设为私有
2 把自身的实例对象设置为final static 属性
3 设置一个返回自身实例的static方法
工厂模式
定义:在一个接口或者抽象类(如果A类只有一个子类的话,就不需要定义接口和抽象类了,直接在某个类中定义它的工厂方法就可以)中定义一个抽象方法(工厂方法),该方法返回某个A类的子类的实例。总的来说就是建立一个类,里面有工厂方法,返回其他类的实例,可以创建同一个类中的多个实例。
实现:1 定义接口--抽象类,一般具有工厂方法(抽象方法)(是否需要创建看A类子类的个数
2 接口子类,实现工厂方法,返回A类的子类实例
3 A类(抽象或者接口),负责定义子类共有的方法(是否创建看子类的个数)
4 A类的子类 ,实现A类的功能
适配器模式
定义:将一个类或者接口所实现的功能转给另一个类或者接口。
实现:1 定义目标类或者接口(具有客户想要的功能,即扩展功能)
2 现在使用的类或者接口(本身具有的功能)
3 如果第二步是一个接口就本步骤定义一个实现该接口的类(其中定义目标类的对象变量,和一个方法。其中方法的参数是目标类的实例(引用),把外部传进来的
目标类实例赋值给前面定义 的目标类类型的对象变量)
观察者模式
定义:观察者模式是关于多个对象依赖于一个对象,当这个对象的数据发生变化时,其他依赖它的对象都得到通知并被自动更新
实现:1 主题接口(包含有这个对象的数据发生多种行为变化的函数 比如增、删、通知观察者方法)
2 具体主题类 (实现这个主题接口的函数--在通知方法里调用观察者接受信息的方法 还有存储观察者的数组和更新的信息)
3 观察者 (定义用来接受数据更新的方法)
4 具体观察者 (实现接受数据更新的方法,并用主题接口定义变量,用来在构造函数中传进来的主题接口引用调用增、删方法来操作具体观察者)
迭代器模式
定义:提供一个方法顺序访问集合对象中的各个元素,而又不需要暴露该对象的内部表示
实现: 1 集合 如List
2 具体集合 ArrayList
3 迭代器 Iterator
4 具体迭代器 经常有集合中的方法返回一个具体迭代器,如set中的iterator
代理模式
定义:为其他对象提供一种代理以控制对该对象的访问 如用户想和老板通电话,必须先与秘书通电话,秘书再(请求)确认老板是否有空,老板有空就把请求委派给老板。
实现:1 抽象主题(即代理什么 接电话、请求等,代理和需要代理的类都要实现这个接口)
2 实际主题 (即实现该抽象主题,实际主题对象就是需要代理实例所要代理的对象)
3 代理(代理类也实现了抽象主题,但还包含实际主题类定义的变量,该变量存储实际主题的对象,这样,代理对象就可以控制外部对实际主题的访问,即在
实现的方法里new 一个实际主题,并赋值给主题对象变量,传数据可以通过构造参数)
享元模式
定义:使用一个称作享元的对象为其他对象提供共享的功能
实现:1 享元接口(该接口定义了对外公开其内部数据的方法,以及享元接收外部数据的方法)
2 具体享元(实现享元接口的方法)
3 享元工厂(负责创建和管理享元对象 即定义一个存储享元的 数组或者 集合,并如果某一个享元对象不在集合中,就创建,并加入集合)