当前位置: 首页 > 科技观察

秒懂了23种设计模式...

时间:2023-03-22 10:59:53 科技观察

图片来自宝途网设计模式有两种分类方法,即根据模式的用途和根据模式的范围。根据模式用来完成什么工作,这种方法可以分为三种类型:创造型模式、结构型模式和行为型模式。创建模式:用来描述“如何创建对象”,其主要特点是“对象的创建和使用分离”。GoF提供了单例、原型、工厂方法、抽象工厂、构建器等5种创建模式。结构模式:用来描述如何将类或对象按照一定的布局组合成一个更大的结构。GoF提供了proxy、adapter、bridge、decoration、appearance、flyweight、combination等7种结构模式。行为模式:用来描述类或对象如何相互协作,完成单个对象单独无法完成的任务,以及如何分配职责。GoF提供了模板方法、策略、命令、责任链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等11种行为模式。根据模式主要用于类还是主要用于对象,这种方法可以分为类模式和对象模式两种。类模式:用于处理类与子类之间的关系。这些关系是通过继承建立的,是静态的,在编译时就确定了。GoF中的工厂方法、(类)适配器、模板方法、解释器都属于这种模式。对象模式:用于处理对象之间的关系。这些关系可以通过组合或聚合来实现,可以在运行时改变,更加动态。GoF中除了上述4种类型外,其他都是对象模式。下表介绍了这23种设计模式的分类:01工厂法追MM请客,麦当劳鸡翅和肯德基鸡翅都是MM最喜欢的食物,虽然口味不同,但是不管你带MM去麦当劳还是肯德基,对服务员说“四翼”就可以了。麦当劳和肯德基是生产鸡翅的Factory工厂模式:顾客类和工厂类是分开的。每当消费者需要某种产品时,他只需要向工厂提出要求即可。消费者接受未经修改的新产品。缺点是修改产品时,工厂类也必须做相应的修改。如:如何创建,如何提供给客户。02建造者模式MM们最喜欢听到那句“我爱你”。当你在不同的地方遇到MM时,你一定会用他们的方言对她说这句话。我有一个多语言翻译器,每种语言上面都有一个按钮,当我看到MM的时候,我只要按下相应的按钮,它就会用相应的语言说“我爱你”,外国MM也可以轻松搞定,这就是我的“我爱你”建设者。构造模式:将产品的内部外观与产品的生产过程分离,使一个构造过程可以生成具有不同内部外观的产品对象。该构造模式使产品内部外观可以自主改变,客户无需了解产品内部构成的细节。构建模式强制执行逐步构建过程。03抽象工厂请MM去麦当劳吃汉堡。不同的MM有不同的口味。记住每一个是一件很烦人的事情。我一般使用FactoryMethod模式。带MM去找服务员说“我要汉堡包”。你想要什么样的汉堡包?直接让MM跟服务员说就好了。工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体的创建工作交给子类,成为抽象工厂角色,只负责给出具体工厂类必须实现的接口,无需触及应实例化哪个产品类的细节。04原型模式在QQ上和MM聊天,一定要说一些情话。我收集了很多下流情话。需要的时候复制出来放在QQ里就行了。这就是我情话的原型。(100元一份,你要吗)原模型模式:通过给定一个原型对象来指明要创建的对象的类型,然后通过复制原型对象来创建更多相同类型的对象。原始模型模式允许动态增加或减少产品类别。产品类别不需要有任何预定的层次结构。原始模型模式适用于任何层次结构。缺点是每个类都必须配备克隆方法。05单态模式我有6个漂亮的老婆,她们的老公都是我,我就是我们家的老公Sigleton。每次说“老公”,都指的是同一个人,就是我。(刚才做了个梦,哪有这么好的东西)单例模式:单例模式保证某个类只有一个实例,自己实例化并提供这个实例给整个系统。单例模式应该只在有真正的“单一实例”需求时使用。06Adapter模式在朋友聚会上认识了香港美女Sarah,但我不会粤语,她也不会普通话,只好求助朋友kent。他充当我和莎拉之间的适配器,让莎拉和我可以互相交谈!(我不知道他会不会玩我)Adapter(transformer)模式:将一个类的接口转换成客户期望的另一个接口,这样两个原本因接口不匹配而不能一起工作的类可以一起工作。适配器类可以根据参数返回一个合适的实例给客户端。07BridgeMode早上遇到MM想说早安;晚上遇到MM要说晚安;遇见MM,你穿了件新衣服,想说你的衣服好漂亮;说你的头发真漂亮。别问我“早上遇到新发型的MM你说什么”,自己用BRIDGE组合就可以了。桥接模式:将抽象和实现解耦,让两者可以独立变化,也就是说把它们之间的强关联变成弱关联,也就是把一个软件系统的抽象和实现之间改用组合/聚合关系的继承关系,以便两者可以独立变化。08合成模式今天是玛丽的生日。“今天是我的生日,你要送我礼物。”“嗯嗯,你自己去店里挑吧。”“这件T恤很漂亮,买吧,这件衣服很漂亮,买吧,这包也不错,买吧。”“哎,我买了三件,只答应送一件作为礼物。”“什么,T恤、裙子、包包就是一套,小姐,请包起来。”……,MM会用到Composite模式,你明白了吗?Composite模式:Composite模式将对象组织成树结构,可以用来描述整体和部分之间的关??系。复合模式是一种处理对象树结构的模式。复合模式用树结构表达部分和整体之间的关系。复合模式允许客户端09装饰模式Mary过生日后,就轮到Sarly过生日了,不要让她自己选择,否则这个月的伙食费肯定会筋疲力尽。拿出去年在华山山顶拍的照片,在背面写上“最好的礼物是爱你的菲塔”,然后去街边的礼品店买了一个相框(那个MM卖礼物也很漂亮),然后找隔壁搞美术设计的Mike设计一个漂亮的盒子装进去……我们都是装饰师,到头来都是装饰我。这个怎么样?你明白吗?装饰模式:装饰模式是为客户端以透明的方式扩展对象的功能,是继承的一种替代方式,提供了比继承更大的灵活性。动态地为一个对象添加功能,这些功能可以动态地撤销。由一些基本函数的排列组合产生的大量函数。10Facademode我有专业的尼康相机,喜欢手动调节光圈和快门,这样拍出来的照片就很专业,但是MM教了半天也不懂这些东西。幸运的是,相机具有Facade设计模式。如果将相机设置为自动模式,只需对准目标并按下快门即可。一切都会由摄像头自动调整,让MM也可以用这个摄像头给我拍照。门面模式:与子系统的外部通信必须通过统一的门面对象来完成。Facade模式提供了一个高级接口,使子系统更易于使用。每个子系统只有一个门面类,这个门面类只有一个实例,也就是说是单例模式。但是整个系统可以有多个外观类。11飞元模式天天跟MM发短信,手指累死了。最近买了一部新手机,手机里可以存一些常用的句子。随时可以发送,无需逐字输入。共享句是Flyweight,MM的名字是提取的外部特征,根据上下文使用。蝇量级模式:FLYWEIGHT指的是拳击比赛中的最轻量级。Flyweight模式以共享的方式有效地支持大量细粒度的对象。享元模式共享的关键是区分内在状态和外在状态。内在状态存储在享元内部,不会随环境变化。外在状态随着环境的变化而变化。外在状态不能影响内在状态,它们相互独立。将可以共享的状态和不能共享的状态从常规类中分离出来,不能共享的状态排除在类之外。客户端不能直接创建共享对象,而应该使用一个负责创建共享对象的工厂对象。享元模式大大减少了内存中的对象数量。12座席模式在网上和MM聊天总是以“hi,howareyou”、“whereareyoufrom”、“howoldareyou”、“howtallareyou”这些词开头。真烦人,咱们写一个程序当我的代理,设置我收到这些词时自己的回答,收到其他词时通知我回答,怎么样,酷。代理模式:代理模式为对象提供代理对象,代理对象控制对源对象的引用。代理是指一个人或机构代表另一个人或机构行事。在某些情况下,客户端不想或不能直接引用一个对象,代理对象可以直接在客户端和目标对象之间起到中介作用。客户端无法区分代理主题对象和真实主题对象。代理模式可能不知道真正的代理对象,只是持有代理对象的一个??接口。此时代理对象无法创建代理对象,必须由系统其他角色创建并传入代理对象。13ChainofResponsibilityMode晚上去上英语课,坐在最后一排刚好走开,哇,前面坐了好几个美女MM。嘿,找一张纸条,写上“嗨,你能做我的女朋友吗?”不愿意的话请传。”纸条一张一张递上去,哎呀,第一排的MM把纸条递给了老师,听说是个老处女。快跑!链子ofResponsibilityMode:在责任链模式中,许多对象通过每个对象对其下家的引用形成一条链,请求在链上传递,直到链上的某个对象决定处理请求,客户端不知道哪个链上的对象最终会处理请求,系统可以在不影响客户端的情况下动态重组链并分配职责。处理者有两个选择:接受责任或将责任转交给下一个一方。一个请求可能不会最终被处理acceptedbyanyreceiverobject.14Commandmode我有一个MM,家里管的很严,互相看不到,所以我只好用她弟弟来给我们发信息,如果她有什么指示,她就写一个请注意并让她的兄弟带来大部头书。不,她哥哥又发了一条命令,为了感谢他,我请他吃了一碗味噌面。谁知道他说:“我同时给姐姐的三个男朋友发了COMMAND,你最便宜,就请我吃面。”命令模式:命令模式将一个请求或操作封装到一个对象中。命令模式将发出命令的责任与执行命令的责任分开,并将它们委托给不同的对象。命令模式让请求方和发送方相互独立,使得请求方不需要知道接收方的接口,更不用说请求是如何接收的,操作是否执行,什么时候执行,以及它是如何执行的。系统支持撤销命令。15翻译模式我有一个《泡 MM 真经》,上面有各种给MM的攻略,比如吃西餐的步骤,怎么看电影等等。和MM约会就做一个翻译,按照上面的该脚本执行得很好。解释器模式:给定一种语言,解释器模式可以定义其语法的表示并同时提供解释器。客户可以使用此翻译器来翻译此语言的句子。解释器模式将描述如何使用给定简单语法的模式设计来解释这些语句。解释器模式中提到的语言是指任何解释器对象都可以解释的任何组合。在解释器模式下,需要定义一个代表语法的命令类层次结构,即一系列的组合规则。每个命令对象都有一个explain方法,表示对命令对象的解释。命令对象层次结构中对象的任何排列和组合都是一种语言。16迭代模式我爱上了玛丽,拼命向她求婚。玛丽:“如果你想让我娶你,你就得答应我的条件。”我:“什么条件我都答应,你说吧。”玛丽:“我爱上了那颗一克拉的钻石。”我:“买了,买了,还有吗?”。玛丽:“我爱上了湖边那栋别墅。”我:“我买,我买,还有吗?”玛丽:“我对那辆法拉利跑车很感兴趣”。我的脑袋嗡嗡作响,坐在椅子上,咬牙切齿:“买了,买了,还有吗?”迭代模式:迭代模式可以顺序访问集合中的元素,而不暴露集合的内部外观。多个对象形成的聚合称为聚合,聚合对象是一个容器对象,可以包含一组对象。迭代子模式将迭代逻辑封装到一个自包含的子对象中,从而与聚合本身隔离。迭代模式简化了聚合接口。每个聚合对象可以有一个或多个迭代器子对象,每个迭代器的迭代状态可以相互独立。迭代算法可以独立于聚合角色的变化。17MediatorMode四个MM在打麻将,不知道谁该让给谁。还好当时我在旁边,按照他们各自的筹码算钱。赚到钱的从我这里拿走,亏钱的也给我付钱,一切都OK,接到了四个MM的电话。调解器模式:调解器模式包装了一组对象交互的方式,这样这些对象就不必显式地相互交互。从而允许它们松耦合。当一些对象之间的交互发生变化时,不会立即影响到其他一些对象之间的交互。保证这些效果可以彼此独立地变化。Mediator模式将多对多交互转换为一对多交互。中介者模式抽象了对象的行为和协作,将对象的小规模行为与其他对象的交互分开。18备忘模式当同时和几个MM聊天时,一定要记住刚才对MM说的话,否则MM知道了会不高兴的。幸运的是,我有一个备忘录。复印一份保存在备忘录中,方便随时查看以前的记录。备忘录模式:备忘录对象是用于存储另一个对象的内部状态快照的对象。备忘录模式的目的是在不破坏封装的情况下捕获对象的状态,将其外化并存储,以便将来在适当的时候将对象恢复到存储的状态。19旁观者模式想了解我公司最新的MM情报吗?加入公司MM情报邮箱群即可。汤姆负责收集信息。他发现的新信息不需要一一通知,而是直接发布到邮件群。我们作为订阅者(观察者)可以及时收到信息。观察者模式:观察者模式定义了多组依赖关系,允许多个观察者对象同时监视某个主体对象。当状态发生变化时,这个主题对象会通知所有观察者对象,使它们能够自动更新自己。20种状态模式与MM互动时,一定要注意她的状态,不同状态下她的行为会有所不同。比如你约她今晚去看电影,对你不感兴趣的MM会说:“有事要做”,不讨厌你但没喜欢过你的MM会说:“好吧,不过同事们可以带我吗?”,已经喜欢你的MM会说:“几点了?看完电影去泡吧怎么样?”。当然,如果你在看电影的时候表现不错,你也可以把MM的状态从讨厌或者不喜欢变成喜欢。状态模式:状态模式允许对象在其内部状态发生变化时改变其行为。该对象似乎已更改其类别。状态模式将所研究对象的行为包装在不同的状态对象中,每个状态对象都属于一个抽象状态类的子类。状态模式的目的是允许一个对象在其内部状态改变时改变它的行为。State模式需要为系统可以达到的每个可能状态创建State类的子类。当系统状态改变时,系统改变选择的子类。21攻略模式不同类型的MM在约会不同类型的女生时需要使用不同的攻略。有的不如请他们看电影,有的不如去吃点心。我的追MM包里有很多攻略。策略模式:策略模式将每个算法封装到一个单独的类中,对一组算法有一个通用的接口,这样它们就可以相互替换。策略模式允许算法改变而不影响客户端。策略模型将行为与环境分开。环境类负责维护和查询行为类,具体策略类提供各种算法。由于算法和环境是独立的,所以算法的增减修改不会对环境和客户端产生影响。22模板方法模式这篇经典文章《如何说服女生上床》你看过吗?女生上床的步骤分为八个步骤:偶遇、打破僵局、追求、接吻、前戏、动手、爱抚、进入(模板法)。但是每一步对于不同的情况都有不同的做法,就看你的应变能力了(具体实现)。模板方法模式:模板方法模式准备一个抽象类,以具体方法和具体构造函数的形式实现部分逻辑,然后声明一些抽象方法强制子类实现剩下的逻辑。不同的子类可以用不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶层的逻辑框架,将逻辑的细节留给具体的子类去实现。23访客模式情人节到了,想给每个MM送一束花和一张卡片,但是每个MM送的花必须根据她的个人特点,每张卡片都要根据她的个人特点来选择。没有人能弄清楚。不如请花店和礼品店老板做Visitor,让花店根据MM的特点选择一束鲜花,让礼品店老板根据每个人的特点选择卡片,这样这会容易得多。访问者模式:访问者模式的目的是封装一些应用于某些数据结构元素的操作。一旦这些操作需要修改,接收这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定义的系统。它解耦了数据结构和作用于该结构的操作之间的耦合,使得操作集可以相对自由地演化。访问者模式使得通过添加新的访问者类来添加新操作变得容易。访问者模式将相关行为集中到一个访问者对象中,而不是将它们分散到单个节点类中。使用Visitor模式时,将尽可能多的对象浏览逻辑放在Visitor类中,而不是放在其子类中。访问者模式可以跨越多个类层次结构来访问属于不同层次结构的成员类。作者:HChan编辑:陶佳龙来源:https://zhuanlan.zhihu.com/p/100746724