设计模式分类(23种)
设计模式优点:使代码的可重用性更高,可读性强,可靠性高,灵活性好,可维护性强,代码编制工程化,提升软件开发效率。
创建型模式(工建单元)
特点:将对象的创建和使用分离
单例,原型,工厂,抽象工厂,建造者等(5种)
结构型模式(组享过乔,装适外代)
特点:将类或对象按照某种布局组成更大的结构
代理,适配器,装饰器模式,桥接,装饰,外观,享元,组合等(7种)
行为型模式(空中双器状观,责命模仿被选策略)
类或对象之间怎么互相协作共同完成单个对象无法单独完成的任务
双器:解释器,迭代器
备选策略(备策):备忘录模式,策略模式
状观:状态模式,观察者模式
责命:责任链模式,命令模式
模仿:模板模式,访问者模式
空中:空对象模式,中介者模式
UML
统一建模语言(UML),是设计软件的可视化建模语言
特点:简单,统一,图像化,能表达软件设计中的动态和静态信息。
UML从目标系统的不同角度触发,定义了用例图,类图,对象图,状态图,活动图,时序图,协作图,构建图,部署图等9种。
UML类图
在UML类图中,类使用包含类名,属性和方法。且带有分割线的矩形来表示。
UML类图中表示可见性的符号有(3种)
+:public
-:private
#:protected
什么都不加:default
属性的完整表示方法:可见性 属性名:类型[=缺省值] 缺省值就是:属性定义的时候赋的值
方法的完整表达方式:可见性 方法名(参数列表)[:返回值类型]
类与类之间的关系(关聚组依继实)
关联关系,聚合关系,组合关系,依赖关系,继承关系,实现关系
关联关系:
单向关联
用一个带箭头的实线表示
双向关联
双向关联就是双方各持有对方类型的成员属性
用一个不带箭头的直线表示
自关联
用一个带有箭头且指向自身的直线表示。
聚合关系:
聚合关系属于关联关系
聚合关系是描述整体对象与局部对象之间的关系
成员独享是整体对象的一部分,但成员对象可以脱离整体对象独立存在。
在UML类图种,聚合关系可以用带空心菱形的实线来表示,菱形指向整体
组合关系:
表示类之间的整体和部分的关系,是一种更强烈的聚合关系
组合关系中,整体对象可以控制部分对象的生命周期,一旦整体对象不存在,部分对象也将不存在,部分对象不能脱离整体对象存在
组合关系用带实心菱形的实线来表示,菱形指向整体
依赖关系:
依赖关系是对象之间耦合度最弱的一种关联关系,在代码中,某个类的方法通过局部变量,方法的参数或者对静态方法的调用来访问另一个类中的某些方法来完成一些职责。
依赖关系使用带有箭头的虚线来表示,箭头从使用类指向被依赖的类。
继承关系:
继承关系是对象之间耦合度最大的一种关系,是父类与子类之间的关系,是一种继承关系。
用带有空心的实线来表示,箭头从子类指向父类,是父类与子类,是一种继承关系。
实现关系:
实现关系是接口和实现类之间的关系,在这种关系中,类实现了接口,类中的操作实现了接口中所声明的所有的抽象操作,耦合度也非常强
在UML类图中,实现关系使用带空心三角箭头的虚线来表示,箭头从实现类指向接口。
设计原则(6个)
1>开闭原则(OCP)
对扩展开放,对修改关闭
在程序进行扩展的时候,不要去修改原有的代码,实现一个热插拔的效果,简言之,是为了使程序的扩展性好,已于维护和扩展。
2>里氏替代原则
任何基类可以出现的地方,子类一定可以出现。子类可以扩展父类的功能,但是不能改变父类原有的功能。除了添加新的方法完成新增功能外,尽量不要重写父类的方法。
通过重写父类的方法完成新的功能,这样看起来虽然简单,但是整个继承体系的复用性会很低,特别氏运用多态比较频繁的时候,程序运行出错的概率会非常大。
3>依赖倒转原则
高层模块不应该依赖底层模块,两者都应该依赖其抽象。简单的说就是要求对抽象进行编程,而不是对实现进行编程。
4>接口隔离原则
客户端不应该被迫依赖它使用的方法:一个类对另一个类的依赖应该建立在最小的接口上。
5>迪米特法则(最少知识原则)
只和你的直接朋友交谈,不跟陌生人说话
如果两个软件实体无需之间通信,那么就不应该发生直接的相互调用,可以通过第三方转发调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
迪米特法则中的"朋友"是指:当前对象本省,当前对象的成员对象,当前对象所创建的对象,当前对象的方法参数等,这些对象同当前对象存在关联,聚合或组合关系,可以直接访问这些对象的方法。
例子:
明星与经纪人的关系实例
明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如和粉丝的见面会,和媒体公司的业务洽谈。这里的经济人是明星的朋友,而媒体公司和粉丝是陌生人,所以适合使用迪米特法则。
6>合成复用原则
尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
通常类的复用分为继承复用和合成复用两种。
继承复用虽然由简单和易实现的优点,但它存在以下缺点。
1:继承复用破坏了类的封装性,因为继承会将父类的实现细节暴漏给子类,父类对子类是透明的,所以这种复用有称之为"白箱"复用。
2:子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,不利于类的扩展和维护。
3:限制了复用的灵活性。父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。
采用组合或聚合复用时,可以将已有对象纳入新的对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,他又一下优点:
1:它维持了类的封装性,因为成员对象的内部细节是新对象看不见的,所以这种复用又叫"黑箱"复用。
2:对象间的耦合度低。可以在类的成员位置声明抽象。
3:复用的灵活度高。这种复用可以在运行时动态进行,新对象可以动态地引用与成员对象类型相同的对象。