![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
zglx123
这个作者很懒,什么都没留下…
展开
-
设计模式之(二十三)访问者模式
访问者模式**概述:**提供一个作用于某对象结构中的各元素的操作表示,它使得可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式。上述代码中的handle对不同类型的员工和不同的部分做了不同的处理,满足了员工数据汇总的要求,但是该解决方案存在如下问题(1)EmployeeList类非常庞大,代码相当冗长,承担了大量的职责,不方便代码的复用,不利于系统的扩展,违背了单一职责。(2)代码存在大量的if…else,导致测试和维护代码难度较大(3)违背开闭原则,如原创 2020-07-26 23:36:51 · 160 阅读 · 0 评论 -
设计模式之(二十二)模板方法模式
模板方法模式定义一个算法的框架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法结构即可重定义该算法的某些特定步骤,是一种行为对象行为型模式。上述代码存在如下问题(1)系统的扩展性差,如果需要增加一种新型类型的用户,那就要修改Account类的源代码,在calculateInsterest()方法中增加新的判断逻辑和实现代码,违背了开闭原则(2)客户端需要逐个调用Account类中定义的方法,而且需要了解这些方法的执行次序,比如validate ->calculateInst原创 2020-07-26 16:01:22 · 148 阅读 · 0 评论 -
设计模式之(二十一)策略模式
策略模式定义一系列算法,将每一个算法封装起来,并让他们可以相互替换。策略模式让算法独立于使用它的客户,也称之为政策模式,是一种对象行为型模式。存在如下问题(1)MovieTicket类的calculate方法非常庞大,它包含各种打折的实现算法,在代码中出现了较长的if…else(2)不符合开闭原则,增加新的打折算法或者对原有算法进行修改时,必须修改MovieTicket类的源代码,灵活性和可扩展性较差。(3)算法的复用性差,如果另一个系统需要重用某些打折算法,只能通过对源代码进行复制,粘原创 2020-07-25 21:49:09 · 154 阅读 · 0 评论 -
设计模式之(二十)状态模式
状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象,同样是一种对象行为型模式。存在问题(1)几乎每个方法都包含判断语句,以判断在该状态下是否具有该方法以及在特定状态下该方法如何实现,导致代码非常冗长,可维护性非常差。(2)拥有一个较为复杂的setCheck方法,包含大量的if…else用于进行状态转换,代码测试难度非常大,且不易于维护。(3)扩展性差,如果新增一个冻结状态,则修要对原有代码进行大量修改,扩展起来非常麻烦。状态模式就是为了解决原创 2020-07-25 12:51:44 · 177 阅读 · 0 评论 -
设计模式之(十九)观察者模式
观察者模式定义对象之间的一种一对多的依赖关系,使得每当一个对象状态发生改变时,其相关依赖的对象皆得到通知并更新。观察者模式的别名为发布-订阅模式,模型-视图模式,源-监听模式或从属模式,是一种对象行为型模式。(1)Subject(目标)目标又称为主题,是指被观察的对象,目标类中定义一个观察者集合,可以接受任意数量的观察者来观察,提供一系列方法来增加或者删除观察者对象,同时定义了通知方法nofity(),其可以是接口,可以是抽象类可以是具体类。(2)ConcreteSubject(具体目标类)原创 2020-07-24 16:11:18 · 222 阅读 · 0 评论 -
设计模式之(十八)备忘录模式
备忘录模式在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态,是一种对象行为型模式,其别名为Token结构图(1)Originator(原发器)是一个普通的类,可以创建一个备忘录,并存储其当前的内部状态,也可以使用备忘录恢复其内部状态,一般将需要保存内部状态的类设计为原发器。原发器是一个具体的业务类。包含一些存储成员数据的属性(2)Memento(备忘录)存储原发器的内部状态,根据原发器来决定保存哪些内部状态。备忘录的设计一般可以原创 2020-07-24 11:20:38 · 128 阅读 · 0 评论 -
设计模式之(十七)中介者模式
中介者模式用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立的改变他们之间交互,所有又称为调停模式,是一种对象行为型模式。存在问题(1)系统结构的耦合度较高,一个组件与其他组件交互过多,形成一个复杂的网状结构。(2)组件的复用性较差。由于一个组件和其他组件有很强的关联性,如果没有其他组件的支持,一个组件很难被其他的系统复用,这些组件往往表现出一个整体。(3)扩展性差,如果增减一个组件都要修改源代码,扩展性和灵活性较差。原创 2020-07-23 15:46:58 · 144 阅读 · 0 评论 -
设计模式之(十六)迭代器模式
迭代器模式提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标。迭代器模式使用对象行为型的模式。(1)遍历和管理未作分离,导致聚合类的职责过重,既可以负责存储和管理数据,又负责遍历数据,违反了单一职责,给测试和维护增加难度。(2)如果将抽象聚合类声明为一个接口,则这个接口充斥了大量的方法,不利于子类实现,违反了接口隔离原则。(3)如果将所有的遍历操作交给了子类,将导致子类代码非常庞大,而且必须暴露AbstractObjectList的内部存储细节,向子类公开自己的属性,破坏原创 2020-07-22 15:04:42 · 261 阅读 · 0 评论 -
设计模式之(十五)解释器模式
解释器模式定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的语言指的是规定格式和语法的代码,是一种对象行为型模式。文法规则和抽象语法树文法规则(1)表达式的组成方式,value和operation是后面两个语言单位的定义,每一个语句所定义的字符串如value和operation称为语言构造成分或语言单位,符号::=表示定义为的意思,左边的语言单位通过右边来进行说明和定义。语言单位分为终结符表达式和非终结表达式,比如operation是非终结表达式,他的组成元素仍然可以是表达原创 2020-07-22 11:03:49 · 92 阅读 · 0 评论 -
设计模式之(十四)命令模式
命令模式将一个请求封装成一个对象,从而可用不同的请求对客户端进行参数化,对请求排队或者记录日志,以及可撤销的操作。命令模式也是一种对象行为型模式,其别名为动作模式或者事务模式。(1)请求发送者和请求接受者之间存在方法直接调用,耦合很高,更换请求接收者必修修改发送者的代码。比如需要将HelpHandler改为WindowsHandler(窗口处理类)则需要修改FuncitonButton的源代码,违背了开闭原则。(2)FuncitonButton类在设计和实现功能已被固定。如果新增一个请求接收原创 2020-07-20 23:59:44 · 722 阅读 · 0 评论 -
设计模式之(十三)职责链模式
职责链模式避免将请求发送者与接受者耦合在一起,让多个对象都有机会接收请求,将这些对象组成连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止,是一种对象行为性模式违背的软件设计原则有(1)单一职责(2)开闭原则(1)Handler(抽象处理者)定义一个处理请求的接口,不同具体处理者处理请求的方式不一样,需要定义一个抽象请求处理办法。因为每个处理者的下级还是处理者,因此还要关联一个抽象处理者类型。(2)ConcreteHandler(具体处理者)它是抽象处理者的子类,处理用户的请求原创 2020-07-20 16:16:26 · 76 阅读 · 0 评论 -
设计模式之(十二)代理模式
代理模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用,是一种对象创建型模式。结构图角色说明(1)Subject(抽象主题角色)它声明了真实主题和代理主题的共同接口,使得在任何使用真实主题的地方都可以使用代理主题,客户端往往需要针对此类编程。(2)Proxy(代理主题角色)代理主题角色包含了对真实主题的引用,可以在任何时候操作真实的主题,提供一个与真实主题角色相同的接口(request),此外可以控制对真实主题的使用,负责在需要的时候创建,或删除真实主题对象,对真实主题加以约束。原创 2020-07-16 18:41:57 · 223 阅读 · 0 评论 -
设计模式之(十一)享元模式
享元模式(实现对象的复用)运用共享技术有效的支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,粒度变化都很小,可以实现对象的多次的复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此被称为轻量级模式,是一种对象结构性模式。(1)内部状态:内部状态是存储在享元对象内部并且不会随着环境改变而改变的状态,内部状态可以共享,比如字符串的内容,不会随着外部变化而变化,无论在任何环境下,字符‘a’始终是‘a’,都不会改成‘b’(2)外部状态是随着环境改变而改变的,不可以共享的状态。享原创 2020-07-16 13:59:15 · 130 阅读 · 0 评论 -
设计模式之(十)外观模式
外观模式外部与一个子系统的通信通过一个统一的外观角色进行,为子系统中的一组接口提供一个一致的入口,外观模式定义了一个高层接口,这一高层接口使得这个子系统更容易的使用。外观模式又称为门面模式,是一种对象结构性模型。上述代码存在如下问题:(1)FileReader类、CipherMachine类、FileWriter类经常会作为一个整体同时出现,客户端代码需要与他们逐个进行交互,导致客户端代码较为复杂,而且每次使用都会有出现。(2)如果需要更换一个加密类,例如将CipherMachine类更换成N原创 2020-07-16 09:49:13 · 266 阅读 · 0 评论 -
设计模式之(九)装饰模式
装饰模式动态的给一个对象增加一些额外的职责,就增加对象功能来说,装饰功能比生成子类实现更灵活,也是一种对象结构型模式。跟之前所设计图片格式在不同的操作系统中显示一样。同样存在以下几个问题(1)系统扩展麻烦,之前提供了画笔问题,如果需要增加新的显示效果或者别的控件,又得增加好几个类继承Component。(2)代码重复,并且冗余,不只是窗体需要设置滚动条,文本框,列表框等也要设置滚动条,在其他几个类中存在相同的具体实现过程,不利于修改或者维护。(3)系统庞大,类的数目非常多。角色说明原创 2020-07-14 23:28:38 · 160 阅读 · 0 评论 -
设计模式之(八)组合模式
组合模式组合多个对象形成树形结构表示具有“整体 - 部分”关系的层次结构,组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体-部分模式”,是一种对象型结构模式。存在问题文件类Folder的设计和实现都非常复杂,需要定义多个集合存储不同类型的成员,还要针对不同的集合提供增加、删除、和获取等管理访问的方法,存在大量的冗余代码。系统没有抽象层,客户端不能统一进行处理。系统的灵活性和可扩展性差,新增叶子和容易都要对源代码进行改动。原创 2020-07-14 16:41:32 · 178 阅读 · 0 评论 -
设计模式之(七)桥接模式
桥接模式概述将抽象部分与其实现部分分离,使他们可以独立的变化,是一种对象型结构模式,又被称为柄体模式或者接口模式。上述设计存在如下问题采用多层继承的结构,导致系统中的类极具增加,没加一个图片格式都要增加4个类。系统扩展麻烦,无论是增加图片格式还是操作系统,都需要增加大量的类。具体的实现类违背了单一职责,不仅要实现不同系统的矩阵显示还要进行图片格式的解析。介入桥接模式维度分离:通过系统分析我们可以得到两种维度,不同系统的显示和图片格式的解析。桥接模式正好解决了这个问题,是两个不同的原创 2020-07-14 13:17:41 · 198 阅读 · 0 评论 -
设计模式之(六)适配器模式
适配器模式概述将一个接口转换成客户希望的另外一个接口,使得接口不兼容的哪些类可以一起工作。其包名为包装类(Wrapper),适配器模式既可以作为类结构模型,也可以作为对象结构模型。(1)Targer(目标抽象类)目标抽象类定义在客户所需的接口,可以是一个抽象类、接口或者是具体类。(2)Adapter(适配器类)适配器调用另外一个接口,作为一个转换器,对Adapter和Target进行适配,适配类是适配器模式的核心,在对象适配器模式中,它通过继承Target并关联一个Adaptee对象,使二原创 2020-07-13 22:25:40 · 182 阅读 · 0 评论 -
设计模式之(五)建造者模式
建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程科技创建不同的表示,也是一种创建型模式建造者模式包含了以下四个部分。(1)Builder(抽象建造者)它为建造一个产品Product对象各个部件指定抽象接口,在该接口中一般声明两类方法buildPartX用于构建复杂对象的各个部件(复杂对象就是包含多个成员变量,这些成员变量也成为零件或者部件,比如汽车包括方向盘,发动机,轮胎等)getResult 用于返回复杂对象,Builder可以是抽象类,也可以是接口(2)Concrete原创 2020-07-12 23:12:45 · 147 阅读 · 0 评论 -
设计模式之(四)原型模式
原型模式概述使用原型实例指定创建对象的种类,并且通过这些原型创建新的对象,同样是一种创建型模式。原创 2020-07-12 17:50:11 · 122 阅读 · 0 评论 -
设计模式之(四)抽象工厂
抽象工厂多态工厂利用具体工厂操作具体产品,那么如果需要更多的产品,就会需要更多的具体工厂类,加大了系统的开销。我们可以考虑一种把相关产品的类由同一个具体的工厂所生产,这就是抽象工厂的思想。使用上一回的多态工厂模式,这将会是一个比较复杂的类图。产品等级与产品族(1)产品等级结构(横向):产品的继承结构,比如一个抽象产品是电视机,其子类可能是海尔电视机、海信电视机、TCL电视机,抽象产品和具体品牌构成了一个等级结构,电视机是父类,具体品牌的产品是子类。(2)产品族(纵向):在抽象工厂模式中,产原创 2020-07-08 01:08:48 · 652 阅读 · 0 评论 -
设计模式之(三)多态工厂
上期简单工厂模式的弊端工厂方法模式概述工厂方法模式:定义一个用于创建对象的接口,让其子类决定将哪一个类实例化,工厂模式让一个类的实例化延迟到了其子类,被称为工厂模式,又被成为虚拟构造器模式,也是一种创建型模式。图中我们可以得知有四个角色(1)抽象产品Product,工厂模式所实例化对象的超类,产品对象的公共父类(2)ConcreateProduct 具体产品类,实现抽象产品接口,由专门的工厂所创建,具体工厂与产品一一对应。(3)Factory 抽象工厂:声明工厂方法用于返回一个产品,原创 2020-07-07 13:33:22 · 182 阅读 · 0 评论 -
设计模式之(二)简单工厂模式
简单工厂模式定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例往往都有一个共同的父类,因为在简单工厂模式中,用户常见实例的方法是静态的,因此简单工厂模式又被称为静态工厂方法,属于创建型模式。未使用简单工厂模式上述代码存在以下情况(1)可以看到,代码中存在大量的if–else,并且相当冗长,代码越长,越难维护,阅读难度和测试难度也挺大,条件的判断语句非常影响系统的性能。(2)Chart类太累了,不单单负责图表的初始化,还负责显示所有的图表,违反了单一原则,不利于类的重用和维护,并原创 2020-07-05 20:57:49 · 136 阅读 · 0 评论 -
设计模式之(一)单例模式
单例模式确保某个类只有一个实例,并且自行实例化向系统中提供这个实例,这个类被称为单例类,它提供全局访问的方法,是一种创建型模式。特点:(1)自行实例化(公有静态方法new 实例)(2)只有一个实例(构造方法设为私有,不让new实例,并且静态方法进行空指针检验)(3)必须自行的向系统中提供这个实例(公有静态方法返回)简单版单例模式/** * 演示单例模式 任务管理器 */public class TaskManager { private TaskManager taskMana原创 2020-07-05 14:16:57 · 1293 阅读 · 1 评论 -
设计模式之初:内功修炼
类与类的UML图示在设计模式中,可以使用类图描述一个模式的结构并对每一个模式实例进行分析。1.类类(class)封装了数据和行为,是面向对象的重要组成部分,是具有相同属性、操作、关系的对象集合的总称。并且每个类都具有一定的职责。设计好的类一般只有一种职责。设计类是面向对象设计中最重要的组成部分,也是最复杂和最耗时的部分。类将被实例化成对象,对象对应用于某个具体的事务,是类的实例。类图是用出现在系统中的不同类来描述系统的静态结构,主要用来描述不用的类以及他们之间的关系。2.类的UML图示在UML中原创 2020-07-04 21:51:04 · 181 阅读 · 0 评论