设计模式
2021-04-20 10:47:43 0 举报
AI智能生成
设计模式
作者其他创作
大纲/内容
知识点
面向对象
三大特点
封装
概念
就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。
特点
将属性私有化(private)
提供相应的get和set方法
重toString方法
根据相应的需求重载构造方法
优点
屏蔽细节
提高安全性
继承
提高代码复用性。
父类的属性方法可以用于子类。
可以轻松的定义子类。
使设计应用程序变得简单。
注意事项
java:只支持单继承,即一个子类只允许有一个父类,但是可以实现多级继承,及子类拥有唯一的父类,而父类还可以再继承。C#:可以多继承,即一个子类可以有多个父类。
子类可以拥有父类的属性和方法。
子类可以拥有自己的属性和方法。
子类可以重写覆盖父类的方法。
使用
在继承中,成员变量的使用
局部成员变量:直接使用
本类成员变量:this.成员变量
父类成员变量:super.父类成员变量
多态
分类
向上转型
向下转型
消除类型之间的耦合关系,实现低耦合
灵活性
可扩充性
可替换性
基本概念
构造方法
构造方法是一种特殊的方法,它是一个与类同名的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
方法的重载
规则
被重载的方法必须改变参数列表(参数个数或者类型不一样)。
被重载的方法可以改变返回类型。
被重载的方法可以改变访问修饰符。
方法的重写
参数列表必须与被重写方法相同。
访问权限不能比父类中被重写的方法的访问权限更低(public>protected>(default)>private)。
private 凡是private修饰的属性或方法能继承
默认的权限修饰的属性或方法 可以继承 但必须在同一包的范围内 可以修饰抽象类和接口 接口中不写为public abstract
父类成员的方法只能被它的子类重写。
被final修饰的方法不能被重写。
构造方法不能
抽象类
抽象类是使用font color=\"#c41230\
接口
接口的权限修饰符只有public和默认
接口中的方法不能使用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 条评论
回复 删除
下一页