设计模式
2021-04-20 10:47:43 0 举报
AI智能生成
设计模式
作者其他创作
大纲/内容
知识点
面向对象
三大特点
封装
概念
就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
特点
将属性私有化(private)
提供相应的get和set方法
重toString方法
根据相应的需求重载构造方法
优点
屏蔽细节
提高安全性
继承
概念
在一个类可以继承另一个类的属性和方法,子类可以选择覆盖父类的方法,并在这个基础上扩展,可以继承一个普通类 抽象类 或接口;继承类通过extend 实现就接口通过implements实现
特点
提高代码复用性。
父类的属性方法可以用于子类。
可以轻松的定义子类。
使设计应用程序变得简单。
注意事项
java:只支持单继承,即一个子类只允许有一个父类,但是可以实现多级继承,及子类拥有唯一的父类,而父类还可以再继承。
C#:可以多继承,即一个子类可以有多个父类。
C#:可以多继承,即一个子类可以有多个父类。
子类可以拥有父类的属性和方法。
子类可以拥有自己的属性和方法。
子类可以重写覆盖父类的方法。
使用
在继承中,成员变量的使用
局部成员变量:直接使用
本类成员变量:this.成员变量
父类成员变量:super.父类成员变量
多态
概念
在继承条件下,具有多种行为表现的集合特征,即多个类重写父类方法
分类
向上转型
向下转型
向上转型
父类 object=new 子类(); 在继承的条件将子类对象赋给父类对象,将父类的引用指向子类对象,
调用时:属性调用的是父类的属性,如果子类重写了父类的的方法,调用的是子类的方法,否则调用的是父类的方法,不能调用子类新增的方法
向下转型
向下转型的前提是,父类已经向上转型,否则会编译错误,
父类 object=new 子类()
子类 subobj=object;
父类 object=new 子类()
子类 subobj=object;
特点
消除类型之间的耦合关系,实现低耦合
灵活性
可扩充性
可替换性
基本概念
构造方法
构造方法是一种特殊的方法,它是一个与类同名的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
方法的重载
在同一个类中,方法名相同,形参类型不同(个数或类型) ,与返回值类型和权限修饰符无关
规则
被重载的方法必须改变参数列表(参数个数或者类型不一样)。
被重载的方法可以改变返回类型。
被重载的方法可以改变访问修饰符。
方法的重写
概念
在继承条件下,子类根据需求重写父类的方法
规则
参数列表必须与被重写方法相同。
访问权限不能比父类中被重写的方法的访问权限更低(public>protected>(default)>private)。
abstract 不能修饰属性和构造方法, 不能同时与private static final修饰一个方法或类
final 修饰的类不能被继承,修饰方法不能被重写,修饰属性是常量不能改变,不能修饰构造方法
static 修饰的方法不能重写,但是能继承,
private 凡是private修饰的属性或方法能继承
默认的权限修饰的属性或方法 可以继承 但必须在同一包的范围内 可以修饰抽象类和接口 接口中不写为public abstract
protected 不能修饰抽象类和接口,可以抽象类中的抽象方方法, 接口中的权限修饰符只能是public abstract
构造方法不能继承,只能通过子类构造方法默认调用或使用super调用
父类成员的方法只能被它的子类重写。
被final修饰的方法不能被重写。
构造方法不能
抽象类
概念
抽象类是使用abstract修饰的类,其中会包含抽象方法, 抽象方法使用abstract修饰的方法,只有方法名,没有方法体;
特点
抽象类中可能会有抽象方法,一个类中有抽象方法那么这个类一定是抽象类;抽象方法存在与抽象类或接口
抽象类也是类,有构造方法,但是不能实例化对象,其中同样有实例变量,实例方法
如果一个抽象类的子类没有完全重写父类的抽象方法那么这个子类还是一个抽象方法,
抽象类只能单继承,也就是说一个子类只有一个父类
所有类的最终父类(超类,基类)都是Object,
接口
概念
使用interface 定义接口,其中包含抽象方法,可以使用implement实现多个接口,重写接口的抽象方法
特点
接口的权限修饰符只有public和默认
接口可以继承多个接口,但不能继承类
接口不能变量,只能定义常量,默认会加上public static
接口中的方法不能使用private protect static final修饰编译会报错
在JDK1.8后接口中可以定义实例方法 使用default修饰方法
this,super关键字
super关键字的用法
子类的成员方法中,访问父类的成员变量。
子类的成员方法中,访问父类的成员方法。
子类的构造方法中,访问父类的构造方法。
this关键字用法
本类成员方法中,访问本类的成员变量。
本类成员方法中,访问本类的另一个成员方法。
本类的构造方法中,访问本类的另一个构造方法。
注意
this关键字同super一样,必须在构造方法的第一个语句,且是唯一的。
this与super不能同时存在。
事件委托
概念
委托就是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他方法一样,具有参数和返回值。委托可以看做对函数的抽象,是函数的‘类’,委托的实例将代表一个具体的函数。
一个委托可以搭载多个方法所有方法依次唤起。可以使委托搭载的方法并不需要属于同一个类。但是委托所搭载的方法必须具有相同的原型和形式,也就是说拥有相同的参数列表和返回值类型。
设计模式
七个设计原则
单一职责原则(SRP)
示例
拍摄ufo
定义
就一个类而言,应该仅有一个引起它变化的原因。
说明
如果一个类承担的责任过多,就等于把这些类的职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其它职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会造成意想不到的破坏
软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离
如果你能想到一个理由去改变一个类,那么这个类就多于一个职责。
里氏代换原则(LSP)
定义
一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且察觉不出父类和子类的区别,也就是在软件里面,把父类都替换成子类,程序的行为不会发生任何改变。
子类可以替换父类。
说明
只有当子类可以替换掉父类,软件单位的功能不受影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。
由于子类型的可替代性才使得使用父类类型的模块在无需更改的情况下就可以扩展。
接口隔离原则
复用原则
开放-封闭原则(OCP)
示例
考研求职两不误
定义
是说一个软件实体(类,模块,函数等等)应该可以扩展,但是不可以修改。
对于扩展就是开放,对于修改就是封闭。
说明
怎样设计才能面对需求的改变时却可以保持相对的稳定性,从而使得系统可以在第一个版本之后不断推出新的版本?
依赖倒转原则
示例
会修电脑不会修收音机
定义
抽象不应该依赖细节,细节应该依赖于抽象
原则
高层模块不应该依赖低层模块,两个都应该依赖抽象
依赖倒转可以说是面向对象设计的标志,用那种语言来编写程序是不重要的,如果编写程序时考虑的如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面型对象设计,反之那就是过程化设计。
迪米特法则
实例
无熟人难办事?
概念
如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要电泳另一个类的某一个方法的话,可以通过第三者转发这个调用。
特点
在类的结构设计上,每一个类都应当尽量降低成员的访问权限,
其实在根本上强调了,类之间的松耦合。
类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。
六个创建模式
工厂三兄弟
简单工厂模式(难度:2颗星)
代码无错就是优?
代码应该具备
命名规范
可维护性
可复用
可扩展
灵活性好
概念
就是将每一个类看成一个部门,独立完成自己的工作,互不打扰,同时还有一个总部类来管理和调用这些类。
面向对象的好处
通过封装,继承,多态降低程序的耦合度。
优点
在工厂类中包含了必要的逻辑判断,根据客户端的选择条件去动态的实例化相关的类,对于客户端来说,去除的了与具体产品的依赖。
工厂方法模式(难度:4颗星)
示例
雷锋依然在人间
概念
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。
抽象工厂模式(难度:4颗星)
示例
就不能不换DB吗?
概念
提供一个创建一系列相关或者相互依赖对象的接口,而不需指定它们具体的类。
优点
在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得十分容易,它只需要改变具体工厂即可使用不同产品的配置。
他让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口,操纵实例,产品的具体类名也别具体工厂的实现分离,不会出现子啊客户端代码中。
缺点
单例模式
有些类也需要计划生育
概念:就是保证某个实例的唯一性,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。
方式
为确保唯一,我们要确保不能在类的外界创建实例(不能使用New关键字),把构造方法私有化(Private)
不能创建新的对象那么我们需要在类的内部创建一个私有的静态成员变量
为了保证外界使用该成员变量,并实例化该对象,就是提供一个共有的静态方法(返回值类型就是该类)
在该方法中要先判断私有的内部成员变量是不是为空,为空的话就先赋值在返回。
饿汉式单例和懒汉式单例
原型模型
实例
简单复印
概念
用原型实例指定创建对象种类,并且通过拷贝这些原型创建新的对象。
就是从一个对象在创建另外一个可定制的对象,并且不需要知道任何创建的细节。
说明
浅复制
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深复制
把所有引用对象的变量指向复制过的新对象,而不是原对象的引用。
优点
一般在不对初始化信息进行隐藏的情况下,用克隆的方式就是最好的办法,这既隐藏了创建的细节,又对性能有了极大的提升。
不用初始化新的对象,而是动态的获得对象运行时的状态。
建造者模式
实例
好菜每回味不同
概念
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的代表。
特点
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模型。
七个结构型模式
装饰模式
示例
穿什么有这么重要?
定义
动态的给对像添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
优点
把类中的装饰功能从类中搬移去除,这样可以简化原有的类。
有效地把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑。
说明
装饰模式是为已有的功能动态地添加更多功能的一种方式。
代理模式
示例
为别人做嫁衣
概念
为其他对象提供一种代理以控制对这个对象的访问。
应用
远程代理
就是为一个对象在不同的地址空间提供局部的代表。这样可以隐藏一个对象存在与不同地址空间的事实。
虚拟代理
根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
安全代理
用来控制真实对象访问时的权限。
智能指引
是指当调用真实对象时,代理处理另外一些事情。
外观模式
实例
牛市股票还会亏钱?
概念
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
特点
设计初期阶段
应该要有意识的将不同的两个层分离,层与层之间建立外观Facade
开发阶段
子系统往往因不断的重构演化而变得越来越复杂,增加一个外观Facade可以提供一个简单的接口,减少他们之间的依赖
维护阶段
在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,为新的系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。
适配器模式
在NBA我需要翻译
组合模式
分公司=一部门
桥接模式
手机软件何时统一
享元模式
项目多也别傻做
十一个行为模式
职责链模式
加薪非要老总批?
命令模式
烤羊肉串引来的思考
解释器模式
其实你不懂老板的心
迭代器模式
想走?可以!先买票
中介者模式
·世界需要和平
备忘录模式
如果再回到从前
观察者模式(发布订阅模式)
实例
老板回来我不知道
概念
定义了一种一对一的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在在状态发生变化时通知所有的观察者对象,使他们能够自动更新自己。
特点
将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象的一致性。我们不希望为了维护一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。
当一个对象的改变需要同时改变其他对象时,而且他不知道具体有多少对象有待改变时,可以考虑使用观察者模式。
一个抽象模型有两个方面,其中一方面依赖于另一方面,这时用观察者模式可以将这俩者封装在独立的对象中使它们各自独立地改变和复用。
观察者模式所作的工作其实就是在接除耦合。让耦合的双方都依赖于抽象,而不是依赖与具体。从而使得各自的变化否不会影响另一边的变化。
不足
当变化的对象或者方法是不一样时就很难实现效果。
事件委托
状态模式
无尽加班何时休
策略模式
商场促销
策略模式是一种定义一系列算法的方法,从概念上来说,所有的这些算法的完成都是相同的工作,只是实现方式不同,它可以以相同的的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合[DPE]。
策略模式封装了变化。
模板方法模式
实例
考试抄错会做也白搭
概念
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
优点
把不变的行为搬移到超类,去除子类中的重复来体现它的优势。
提供了一个很好用的代码复用平台。
当不变的行为和可变的行为的方法在子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。模板方法可以帮助我们把这些行为搬移到单一的地方,这就帮助子类摆脱重复的不变行为的纠缠。
访问者模式
男人和女人
0 条评论
下一页