![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
设计模式
设计模式
SpringHeather
这个作者很懒,什么都没留下…
展开
-
设计模式的应用场景(23)--解释器模式
解释器模式定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。优点:容易修改和拓展语法,适用于文法简单并且对处理效率要求低的情况。缺点:不适用于发杂文法的情况。使用时机:当有一个语言需要解释执行,并且可将该语言中的句子表示为一个抽象语法树的时候,可以用解释器模式。下面代码要把“我 爱 你”翻译成为英文,空格也要翻译,正好用上解释器模式。可以看到这里有四个字符需要翻译,先把公用的翻译接口定义出来public interface Interpret原创 2020-05-19 18:47:06 · 534 阅读 · 0 评论 -
设计模式的应用场景(22)--迭代器模式
迭代器模式定义:提供了一种顺序访问一个聚合对象中各元素而又不暴露该对象内部结构的方法。优点:分离了集合对象的遍历行为,抽象出一个迭代器类来负责。缺点:仅适用于访问容器。Java一些容器已经实现了迭代器模式,例如List,Map好吧,我们直接使用,不再自己生产了。import java.util.List;import java.util.ArrayList;import java.util.Iterator;import java.util.Map;import java.util.Ha原创 2020-05-19 18:44:50 · 345 阅读 · 0 评论 -
设计模式的应用场景(16)--策略模式
策略模式定义:针对一组算法,将每一个算法封装到具有共同接口的独立的类中,使得它们可以互相替换。优点:替换继承关系,避免使用多重条件转移语句。缺点:客户端必须知道所有策略类,并自行决定使用哪一种策略类。如果算法较多,则会造成很多的策略类。使用时机:当系统能在几种算法中快速地切换,或系统中有一些类,它们仅行为不同时,或系统中存在多重条件选择语句时,可以考虑采用策略模式。小巩需要设计薪资系统,目前各个子公司的算法不一样,怎样才能兼容或切换各个算法呢?先把薪资三个组成部分的抽象类写出来public i原创 2020-05-19 18:42:09 · 124 阅读 · 0 评论 -
设计模式的应用场景(21)--备忘录模式
备忘录模式定义:该模式就是一个对象复制保存另外一个对象内部状态的对象。便于将对象状态恢复到原先保存的状态。优点:可以避免暴露一些应由源发器(就是生产原始对象的类)管理却又必须存储在源发器之外的信息。缺点:开销大代价可能高。要保存的可能信息多,或者频繁保存恢复。使用时机:当系统必须要保存一个对象在某一个时刻的状态,以方便需要的时候能恢复到先前的状态时,就可以使用备忘录模式。领导找小巩建立一个会议纪要系统,需要保存相关信息,需要的时候可以查阅。首先设计一个会议纪要类,记录会议名字,参与人名,内容,用原创 2020-05-19 18:40:42 · 365 阅读 · 0 评论 -
设计模式的应用场景(20)--调停者模式
调停者模式定义:一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的交互。优点:当使用调停者模式时它将各个通信的对象解耦,使得原本分布在多个对象间的行为集中在一起,改变这些行为只需要生成新的协调类即可。便于维护拓展。缺点:使控制集中化,因为所有的交互都集中在调停者类中。这个类变得复杂难管理。小巩需要做一个交通通信系统,支持不同种类的车互相通信。如果不用调停者模式,需要写很多不同种类车的send方法。下面看看调停者模式的实现,先实现原创 2020-05-19 18:37:27 · 175 阅读 · 0 评论 -
设计模式的应用场景(19)--访问者模式
访问者模式定义:封装一些施加于某种数据结构上的操作,一旦这些操作需要改变的话,接受这个操作的数据结构可以保持不变。优点:使用访问者模式,对于原来的类层次增加新的操作只需要实现一个具体访问者角色,而不必改变整个类层次。每个具体的访问者角色都对应于一个相关操作。缺点:不适合具体元素角色经常发生变化的情况。每增加一个元素类都需要修改访问者类(也包括访问者类的子类或者实现类),修改起来相当麻烦。也就是说,在元素类数目不确定的情况下,应该慎用访问者模式。使用场合:当一个对象结构包括很多类对象,它们有不同的接口原创 2020-05-19 18:34:41 · 1053 阅读 · 0 评论 -
设计模式的应用场景(18)--命令模式
命令模式定义:把一个请求或者操作封装到一个对象中。命令模式把发送命令的责任和执行命令的责任分割开,委派给不同的对象。优点:命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开,从而使新的命令类可以很容易被加入到系统当中。缺点:命令类较多时不便于管理。使用时机:当需要先将一个函数登记上,然后再以后调用此函数时,就需要使用命令模式,其实这就是回调函数。小巩在饭店吃饭,看到点菜单把顾客要点的菜告诉给厨师,厨师根据菜单来做菜。这种情形类似命令模式。先设计厨师类:public class C原创 2020-05-19 18:19:02 · 299 阅读 · 0 评论 -
设计模式的应用场景(17)--职责链模式
职责链模式定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求直到有一个处理它为止。优点:降低类之间的耦合度,使得处理类仅需要保持一个指向后继者的引用,也使得一个对象无需知道是其他哪一个对象处理其请求,对象仅需知道该请求会被正确处理。接收者和发送者都没有明确的对方信息,增强了给对象指派职责的灵活性。缺点:因为对象不知道是其它哪一个对象处理其请求的,所以职责链模式不保证对象被接收。使用时机:当有多个对象处理请求,而且需要动态指定处理原创 2020-05-19 18:16:39 · 246 阅读 · 0 评论 -
设计模式的应用场景(15)--状态模式
状态模式定义:把所有研究对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的子类。意图是一个对象在内部状态改变的时候,行为也改变。优点:具体状态角色将具体状态和它对应的行为封装了起来,使得增加一种新状态很简单,不需要用复杂冗余的逻辑判断语句。缺点:状态太多时,结构分散逻辑不太清楚。QQ的不同状态可以用状态模式来处理,包括离线,登录中,在线和忙碌。首先设计一个抽象的状态类,定义不同状态要处理的动作。public interface QQState { void handl原创 2020-05-19 18:12:08 · 448 阅读 · 0 评论 -
设计模式的应用场景(14)--观察者模式
观察者模式定义:让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能自动更新自己。优点:降低被观察者和观察者之间的耦合度,每一个具体观察者都实现一个相同的抽象观察者接口。观察者向被观察者注册,被观察者支持广播通信。缺点:如果有多个观察者,通知所有观察者耗时较大。小巩公司需要设计股票行情系统,电脑,手机客户端都需要收到行情。首先,设计客户端public interface StockObserver { void updatePrice(S原创 2020-05-19 18:08:36 · 272 阅读 · 0 评论 -
设计模式的应用场景(13)--模板方法模式
模板方法模式定义:定义一个算法的骨架,而将具体的算法延迟到子类中实现优点:灵活地实现具体的算法,满足用户灵活多变的需求。缺点:算法骨架需要改变时需要修改抽象类。使用时机:当系统中算法的骨架是固定的时候,而算法的实现可能有很多种的时候,就需要使用模板方法模式。小巩需要做一个报表打印程序,用户规定需要表头,正文,表尾。但是客户的需求会变化,一会希望这样显示表头,一会希望那样显示。这时候采用模板方式就合适。public abstract class Report { public void原创 2020-05-19 18:03:48 · 329 阅读 · 0 评论 -
设计模式的应用场景(12)--享元模式
享元模式定义:采用一个共享来避免大量拥有相同内容对象的开销。这种开销中最常见、直观的就是内存的损耗。享元模式以共享的方式高效的支持大量的细粒度对象。优点:节省空间。缺点:如果需要维护的享元很多则查找的时候需要大量的时间,该模式以时间换空间。小巩需要实现文字注册码,以“好好学习,天天向上”。如果采用每一个字都注册对象的话,以后再使用的时候,还需要重新创建。怎么办呢?可以设立一个共享池,需要的时候从共享池里取。代码也比较简单public interface Flyweight { Stri原创 2020-05-19 18:00:54 · 462 阅读 · 0 评论 -
设计模式的应用场景(11)--组合模式
组合模式定义:把部分和整体的关系用树形结构表示,从而使客户端能把一个一个的部分对象和由它们组合起来的整体对象采用同样方式处理。它也是继承的一个替代方案。优点:组合模式能提供比继承关系更灵活的功能,并且可以灵活组合子对象和父对象的关系从而使客户端的调用简单,客户端可以一致地使用组合结构或其中单个对象,简化了客户端代码。缺点:很难限制向集合中添加的新组件的类型。使用时机:当系统要描述的对象是树形结构,并且要在客户端忽略掉子对象和父对象的区别,就需要使用组合模式。小巩需要统计各个子机构的总人数,如果使用原创 2020-05-19 17:58:46 · 767 阅读 · 0 评论 -
设计模式的应用场景(10)--桥模式
桥模式定义:将抽象化与实现化脱耦,使得两者可以独立地变化。也就是在一个软件系统的抽象化和实现化之间使用组合关系而不是继承关系。从而使两者可以独立地变化。优点:桥模式能提供比继承关系更灵活的功能,当有新的抽象或者实现方式时只需要集成一个抽象类或者一个实现即可。缺点:如果重新抽象出另外一个类型,则需要修改抽象。使用时机:当系统需要在它的抽象和实现之间增加更多的灵活性,或者一个对象有多于一个的抽象和实现时,需要桥模式。小巩的项目需要为汽车管理所建立一个汽车管理的模型,要求对各个汽车制造商生产的各种汽车进原创 2020-05-19 17:50:39 · 170 阅读 · 0 评论 -
设计模式的应用场景(9)--装饰模式
装饰模式定义:装饰模式以对客户端透明的方式扩展对象的功能,是继承方案的一个替代方案,提供比继承更多的灵活性。优点:能够提供比使用继承关系更加灵活的拓展对象的功能,它可以动态增加对象的功能并且可以随意组合这些功能。缺点:使用装饰模式进行设计往往会产生很多看上去相似的小对象。使用时机:当系统需要扩展一个类的功能,或者客户端需要动态的给一个对象添加功能,并且使用继承会很复杂时候。其实对于装饰者模式大家并不陌生,相反接触的还很平凡,因为Java中的IO机制就用到了装饰者模式。比如大家最常用的语句:Buf原创 2020-05-19 17:46:56 · 227 阅读 · 0 评论 -
设计模式的应用场景(8)--代理模式
代理模式定义:给一个对象提供一个代理对象,由这个代理对象控制对原对象的引用,使代理类在客户端和原对象之间起到一个中介的作用。优点:使用代理模式能够在不改变原来代码功能的基础上对某一对象进行额外的控制,是面向对象中单一职责的体现。缺点:对于静态代理来说一个接口只服务于一种类型,如果要代理的方法很多则要为每一个方法定义一个接口。使用时机:当系统需要对某个对象进行额外的控制时。下面以系统日志记录为例(1)最简单直接的做法public class Test { private Logger原创 2020-05-19 17:32:37 · 300 阅读 · 0 评论 -
设计模式的应用场景(7)--适配器模式
适配器模式定义:将一个系统的接口转换成另外一种形式,从而使原来不能直接调用的接口变得可以调用。优点适配器模式也是一种包装模式,它与装饰模式同样具有包装的功能,此外,对象适配器模式还具有委托的意思。总的来说,适配器模式属于补偿模式,专用来在系统后期扩展、修改时使用。缺点过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。原创 2020-05-19 17:28:49 · 370 阅读 · 0 评论 -
设计模式的应用场景(6)--外观模式
外观模式定义:为对外提供一组接口的子系统提供一个统一的界面,使得其他系统对该系统的访问都通过这个统一的界面来完成。优点:通过统一对外接口访问系统,避免了外部系统和子系统之间的直接联系从而降低了系统间的依赖和复杂度。缺点:限制了外部系统对子系统的灵活调用。使用时机:当一个复杂的系统需要对外提供接口时,就需要将对外提供的接口同一封装在一个外观类里,供外系统使用。下面举例说明外观模式的应用:小巩公司的内部网是由其他人负责设计的,而小巩需要设计人力资源系统。内部网需要人力资源系统提供人员的相关信息。人力原创 2020-05-19 17:27:09 · 141 阅读 · 0 评论 -
设计模式的应用场景(5)--单例模式
单例模式定义:单例模式确保一个类只有一个实例并且该实例必须自动创建,具有唯一的全局访问点。优点:客户端智能通过一个公共的调用点对类实例进行调用。缺点:实现单例模式的类不能被别的类继承。使用时机:当系统要求一个类只有一个实例时候。单例模式在程序设计中使用的频率非常之高,其设计的目的是为了在程序中提供唯一一个对象(保证只被构造一次),例如写入日志的log对象,windows的任务管理器实现(只能打开一个)。这里主要介绍单例模式使用Java的实现(包括饿汉式及懒汉式)。实现这里使用Log类作为例子,原创 2020-05-19 17:25:21 · 86 阅读 · 0 评论 -
设计模式的应用场景(4)--原型模式
原型模式定义:通过一个原型对象来表明要创建的类型,然后复制这个原型对象的方法来创建更多同类型的对象。优点:可以动态地添加产品类而且对整体结构没有影响。缺点:由于原型模式需要给每一个类都配备一个克隆的方法,这就需要在设计类时通盘考虑。因为在已有类的基础上添加clone操作比较困难。使用时机:比如有一个对象,在某一个时刻该对象中已经包含了一些有效值,此时可能会需要一个和该对象完全相同的新对象,并且此后对新对象的任何改动都不会影响到原来对象中的值。下面以配钥匙为例://钥匙的原型类public ab原创 2020-05-19 17:19:53 · 160 阅读 · 0 评论 -
设计模式的应用场景(3)--创建者模式
创建者模式定义:创建者模式就是将一个复杂对象的创建与它的表示分离,是的同样的构建过程可以创建不同的表示,客户端不需要知道对象的创建细节。原理:创建者模式主要由5部分组成:组装类、抽象创建者类 以及具体创建者类、抽象产品类以及具体产品类。优点:在创建者类中,客户端不再负责对象的创建和组装,而是把这个创建的责任交给具体的创建者类,组装的工作交给具体的组装类,客户端只负责对象的调用,明确了各个类的职责。缺点:虽然利用创建者模式可以创建出不同类型的产品,但如果产品之间的差异过大,则需要编写多个创建者类才能实原创 2020-05-19 17:10:34 · 234 阅读 · 0 评论 -
设计模式的应用场景(2)--工厂相关模式
简单工厂模式定义:简单工厂模式又叫做静态工厂模式,它定义一个具体的工厂类来 负责创建一些类的实例,而这些被创建的类应该有一个共同的父类, 这样就可以面向抽象而不是面向具体编程。说明:不属于23种GOF设计模式;工厂方法一般设成静态方法,返回值一般是抽象类或接口,具体的产品类一般继承或实现抽象类、接口;优点:产品使用者不需要关心产品类的创建过程,与具体产品的实现类达到解耦的效果;缺点:违背"开放–封闭"原则(OCP),因为新增一个产品类的时候,需要修改原先的工厂方法;适用时机:当工厂类负责创建的对原创 2020-05-19 17:07:01 · 297 阅读 · 0 评论 -
设计模式的应用场景(1)--分类和原则
设计模式的分类设计模式分为三种类型,共23种。创建型模式:简单工厂模式(Simple Factory)工厂方法模式(Factory Method)抽象工厂模式(Abstract Factory)创建者模式(Builder)原型模式(Prototype)单例模式(Singleton)结构型模式:外观模式(Facade)适配器模式(Adapter)代理模式(Proxy)装饰模式(Decorator)桥模式(Bridge)组合模式(Composite)享元模式(Flyweight)原创 2020-05-19 17:00:59 · 1057 阅读 · 0 评论