设计模式
文章平均质量分 94
低维度的优雅,高维度的设计。
samarua
while "live" : print("Loli")
展开
-
【设计模式】用一个专题带你玩转设计模式
???? 什么是设计模式?如果说代码是砖石,那么设计模式就是蓝图,它描述了开发者如何建成一座稳固的大厦。设计模式(Design pattern)代表了最佳的实践。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案,这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 ???? 设计模式有何作用?设计模式是针对软件设计中常见问题的 工具箱 , 其中的工具就是各种经过实践验证的解决方案。即使你从未遇到过这些问题,了解模式仍然非常有用,因为它能指原创 2021-08-18 09:35:59 · 253 阅读 · 0 评论 -
【设计模式】访问者模式(Visitor Pattern)
???? 核心访问者模式将数据结构与数据操作分离。被访问者拥有一个接待访问者的方法,该方法实现调用主体的反转。 ???? 问题场景你的朋友是一名资深的保险推销员。迫于业绩的压力,他决定拜访街区中的每栋楼,尝试向他们推销保险。他的业务能力非常优秀,可以根据不同的客户推销不同的保险产品。如果是居民楼,他会推销医疗保险;如果是银行,他会推销失窃保险;如果是餐厅,他会推销火灾意外险…现在,你想为这个行为建模。 ???? 解决方案这是个典型的适合访问者模式的场景原创 2021-08-18 09:30:21 · 208 阅读 · 0 评论 -
【设计模式】模板方法模式(Template Pattern)
???? 核心在父类中定义一个算法的骨架,子类实现骨架中的方法,但不能改变骨架的结构。 ???? 问题场景你是一名房屋建筑设计师,现在你需要给一片别墅区设计房屋。这片别墅区计划建造200座别墅,而且,每一座别墅不能相同,必须各具特色——毕竟,你是在设计别墅区,而不是千篇一律的居民楼。你花了三天时间从头到尾设计了一座别墅,又花了三天时间从头到尾设计了一座别墅,又花了三天时间从头到尾设计了一座别墅…还有197座别墅没有设计啊!!!你绝望的哭出了声 >_<&nb原创 2021-08-18 09:29:48 · 169 阅读 · 0 评论 -
【设计模式】策略模式(Strategy Pattern)
???? 核心策略模式就是定义一系列的算法,把它们一个个封装到不同的类中,并且使它们可相互替换。 ???? 问题场景你是一名选择恐惧症重度患者。你快要迟到了,但当你刚踏出家门后,就犯了难——你可以选择骑自行车,也可以做公交车,还可以预约出租车,甚至干脆跑去学校。 ???? 解决方案每一种交通方式,就是一种策略。如果让你写代码,对于这么多种交通方式,你打算用使用 if-else ,将这么多选择和逻辑挤在一个类当中吗?我们有更加优美的设计——对于每一种交通方原创 2021-08-18 09:29:16 · 145 阅读 · 0 评论 -
【设计模式】状态模式(State Pattern)
???? 核心状态模式让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。一个行为使其从一种状态转移到另一种状态,这和「有限状态自动机」极其相似。 ???? 问题场景你正在给一个 音乐播放器(MusicPlayer) 的按键编写逻辑。这个 音乐播放器 看样子很简单,它只有四个按键(锁定键(lock) 、播放键(play) 、上一首键(prev) 、下一首键(next)),以及三种状态(锁定状态(locked) 、就绪状态(ready) 、播放原创 2021-08-18 09:28:41 · 150 阅读 · 0 评论 -
【设计模式】观察者模式(Observer Pattern)
???? 核心观察者模式即发布-订阅模式。发布者的状态发生改变,所有订阅者都将得到通知。 ???? 问题场景小镇里开了一家苹果专卖店,你是这家店的店主。一方面,小镇里的许多顾客都对苹果的电子产品十分感兴趣,他们每天都会来店里,瞧瞧有没有新发布的产品到货。当然,他们总是空手而归。另一方面,每次有新发布的产品到货,你都会发邮件给小镇里所有的居民。但有的居民对苹果的电子产品丝毫不感兴趣,收到邮件后直接将其视为垃圾邮件,丢进邮件垃圾箱。你似乎遇到了一个矛盾:要么让顾客浪费时间原创 2021-08-17 14:01:18 · 190 阅读 · 0 评论 -
【设计模式】备忘录模式(Memento Pattern)
???? 核心备忘录模式会捕获一个对象的内部状态,并在该对象之外保存这个状态,从而可以在以后将对象恢复到原先保存的状态。 ???? 问题场景你是一名二十年前的海报设计师。最近,一款强大的图形编辑软件(PS)诞生了,你成为了第一批PS试用者。这个新生的强大工具令你感到惊艳,然而,你发现了一个致命的问题——当你错误执行了一个操作后,只能再次执行一个操作甚至多个操作才能将它的产生的效果抵消掉。“如果我能撤销这个操作,或者说回退到之前的历史版本就好了”。你自言自语道。无论是撤原创 2021-08-17 14:00:45 · 249 阅读 · 0 评论 -
【设计模式】中介者模式(Mediator Pattern)
???? 核心减少对象之间混乱的通信,由中介者对它们进行统一的协调。 ???? 问题场景你是一名机场管理员,最近的安全问题令你时刻提心吊胆。事情是这样的。由于最近的天气原因,附近的许多机场已经关停,导致你所管理的机场需要降落的飞机数量急剧上升。这造成了严重的问题——飞行员需要留意机场附近的所有飞机,甚至需要与数十位飞行员共同讨论降落顺序。即使飞行员们尽全力进行通信,你已经数次看见两架甚至三架飞机擦肩而过的场景。不能再这样下去了,必须赶快想一个办法! ????原创 2021-08-17 14:00:19 · 188 阅读 · 0 评论 -
【设计模式】迭代器模式(Iterator Pattern)
???? 核心把遍历元素的任务交给迭代器即可。既让客户端感到方便,又能隐藏集合的底层实现。 ???? 问题场景你计划在罗马游览数天,参观完所有的旅游景点。但当你兴致勃勃的来到罗马,却发现自己一直在兜圈子——这是你第三次在罗马斗兽场抚摸渗透着血腥气味的墙壁,第四次在君士坦丁凯旋门前欣赏这古老帝国的残迹,第五次将手伸进真理之口祭奠与曾经深爱之人的回忆,第六次在萨图尔诺农神庙的残破基座下企图发现黄金的秘密…你在偌大的罗马城中迷路了。 ???? 解决方案还好,你原创 2021-08-17 13:59:53 · 140 阅读 · 0 评论 -
【设计模式】命令模式(Command Pattern)
???? 核心命令模式即发送者-命令-接收者的结构。这替代了发送者对接收者的直接调用。 ???? 问题场景在市中心逛了很久的街后,你找到了一家不错的餐厅。这家餐厅不仅装修简约朴素,在对员工的雇佣上也是极为精简——这里连个服务员都没有,只有厨师一个人在厨房里闷头做菜。美味的食物才是餐厅的灵魂,你这么安慰着自己。你瞧了瞧墙上贴着的菜单,嗯嗯,油焖茄子看样子非常美味。于是你亲自来到厨房,告诉厨师你要点一份油焖茄子。回到座位后,你觉得想再来点肉类,于是你又亲自来到了厨房,告诉原创 2021-08-17 13:59:19 · 189 阅读 · 0 评论 -
【设计模式】责任链模式(Chain Pattern)
???? 核心责任链上的每个处理者都拥有下一个处理者的引用。请求被放到责任链上,如果当前处理者无法处理该请求,那么它会把请求传送给下一个处理者,以此类推。 ???? 问题场景一家大型商场发生了火灾。幸运的是,火灾发生在深夜,所以没有人受伤;但货架上可怜的商品就没这么幸运了,它们都被烧毁,损失达到了一亿美元。市民们上街游行,谴责政府对商场的安全问题监督不善。办公室里的官员们焦头烂额,不知道该如何处理这件事情… ???? 解决方案好在,政府有一个完整的上报制原创 2021-08-17 13:58:36 · 200 阅读 · 0 评论 -
【设计模式】代理模式(Proxy Pattern)
???? 核心为原对象提供一个代理,代理可以保护、缓存、增强、控制原对象。 ???? 问题场景你是一名 SUPER STAR。作为一名超级明星,在光鲜亮丽、万众瞩目的同时,你也有着许多烦恼。你每天要与广告商洽谈合作,要联系演出场地进行筹划,还要与粉丝们交流互动…这令你有些力不从心。SUPER STAR 的烦恼,有谁能明白呢?你心里暗暗叹息道。 ???? 解决方案聪明的你立即想到了一个好法子:找一个经纪人。经纪人帮你与赞助商接洽、帮你筛选广告商、帮你安排演原创 2021-08-17 13:51:25 · 148 阅读 · 0 评论 -
【设计模式】享元模式(Flyweight Pattern)
???? 核心享元模式通过共享多个对象所共有的相同状态,减少对象占用的内存。享元模式的本质其实是缓存。 ???? 问题场景你是一名游戏地图建模师,复杂搭建游戏地图。现在,你需要搭建一座森林。森林中有成千上万个棵 树(Tree) ,没棵树具有的属性有 位置(x, y) 、高度(h) 、颜色(color) 、材质(texture) 。你做出了成千上万棵树的对象,搭建出了一座美丽而壮观的森林。你迫不及待的把地图工程发送给你的朋友,让他体验一下这座森林。尽管地图工程在你的电脑上原创 2021-08-17 13:50:22 · 137 阅读 · 0 评论 -
【设计模式】外观模式(Facade Pattern)
???? 核心外观模式为一组繁杂的接口提供了一个简洁的高层接口。内部子系统的复杂性被隐藏,从外观看来简单易用。 ???? 问题场景你在暑假里放飞自我,空调20度,零食一大堆,熬夜看比赛。果不其然,你发烧了。你来到医院,却没想到烦心的事儿才刚刚开始。因为医院是一个「复杂的系统」,因而采用的是“分而治之”的思想,将看病的过程分成了许多个「子系统」——挂号、候诊、门诊、化验、划价、取药、缴费…顶着高烧,你在医院走廊里来回穿梭,在各个部门间反复横跳,在许多医生间不断周旋…&原创 2021-08-17 13:49:44 · 159 阅读 · 0 评论 -
【设计模式】装饰器模式(Decorator Pattern)
???? 核心装饰器模式是对现有类的一个包装,是继承的一种替代方案。装饰类中拥有一个指向现有类的成员变量。 ???? 问题场景你是一名MOBA游戏设计师。在你设计的这个MOBA游戏中,英雄升级后可以选择学习一个附加的技能。现在,有一名 英雄(Hero) ,他的名字叫 捕鲨者(SharkKiller) ,随着等级的提升他可以学习的技能有 Q 、W 、E 、R 。这时作为设计师的你犯了难——根据开闭原则,你不想改变原生 捕鲨者 的代码,所以当他学习了技能后,你需要派生出多个原创 2021-08-17 13:48:35 · 188 阅读 · 0 评论 -
【设计模式】组合模式(Composite Pattern)
???? 核心组合模式将对象组合成树状的层次结构。组合模式使得用户对简单元素和复杂容器的使用具有一致性。 ???? 问题场景你正在为一家商场开发计价程序,用来计算一名顾客所购买商品的总价。这家商场使用 袋子(Bag) 来装 商品(Product) 。一个袋子中可以装若干个商品或若干个小袋子,小袋子中又可以装若干个商品或若干个小小袋子…以此类推。商品(Product) 上会带有价格标签,而 袋子 上不会有任何信息——你只有打开这个袋子,才能知道里面装的是什么。此时你会如原创 2021-08-17 13:47:43 · 388 阅读 · 0 评论 -
【设计模式】桥接模式(Bridge Pattern)
???? 核心桥接模式把复杂类解耦为两个独立的维度,使得二者可以独立变化。 ???? 问题场景你是一个粉刷匠。现在有许多 图形(Graph) 需要你去粉刷。图形多种多样:红色圆形(RedCircle) 、红色正方形(RedSquare) 、红色三角形(RedTriangle)蓝色圆形(BlueCircle) 、蓝色正方形(BlueSquare) 、蓝色三角形(BlueTriangle)绿色圆形(GreenCircle) 、绿色正方形(GreenSquare) 、绿色三原创 2021-08-17 13:46:38 · 160 阅读 · 0 评论 -
【设计模式】适配器模式(Adapter Pattern)
???? 核心适配器模式使得原本不兼容的两个类可以合作工作。适配器的本质是欺骗,它有着A类的外表,却有着B类的内容。 ???? 问题场景你是一个手机制造商。最近的科技发展迅猛,产生了一个让你头疼不已的问题。之前处于3G时代,卡很小,手机的卡槽也很小;现在进入6G时代,电话卡很大,手机的卡槽也很大。很多人会选择不断更换更先进的手机,但不愿意丢弃之前的电话卡——问题出现了,3G时代的小电话卡,怎么插入6G时代的大卡槽呢?将旧电话卡升级改造一下?你不想重构旧电话卡的代码。给原创 2021-08-17 13:45:06 · 255 阅读 · 0 评论 -
【设计模式】单例模式(Singleton Pattern)
???? 核心单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。饿汉很饿,在类加载时就实例化;懒汉很懒,第一次调用时才初始化。 ???? 问题场景假如你是上帝,你的手边有一个 Sun(太阳) 类的图纸。这时你突然犯了难?天空中同时放几个太阳呢 —— 一个是不是太少?九个是不是太多?每天升起的必须是一个太阳吗 —— 日复一日用这一个太阳?还是每天升起一个全新的太阳呢? ???? 解决方案显然,太阳的只有一个。这就是一个典型的单例模式 —— 无原创 2021-08-17 13:43:42 · 173 阅读 · 0 评论 -
【设计模式】原型模式(Prototype Pattern)
???? 核心直接复制已有对象,而不依赖它们所属的类。对象本身自己复制自己。 ???? 问题场景有一天你在森林中散步时,突然发现不远处泛着蓝光。你凑近过去,发现这个是一架刚刚坠落的UFO。UFO上已经没有了外星人,看来是已经逃生走了;这架UFO除了刮蹭,也没有任何的损坏——这令你欣喜若狂。如果你可以「复制」出一架UFO,你将成为本世纪最天才的发明家!你搜遍了整个驾驶舱,终于发现了一张UFO构造图纸。通过这张图纸,你知道了这是一个 UFO 类,以及它的组成部件(成员变量)原创 2021-08-17 13:41:01 · 128 阅读 · 0 评论 -
【设计模式】建造器模式(Builder Pattern)
???? 核心通过建造器,使用多个简单的对象一步一步构造出一个复杂的对象。 ???? 问题场景你现在从一名程序开发者转行为了一名房屋建筑师。你的任务就是建房子。你很快建好了一个 房子(House) 。这个房子普普通通,压根不是什么难事儿。很快,你收到了越来越多的订单,房子好像愈加复杂了起来:一个 带花园的房子(HouseWithGarden) …一个 带车库的房子(HouseWithGarage) …一个 带泳池的房子(HouseWithSwimmingPool) …原创 2021-08-17 13:40:10 · 343 阅读 · 0 评论 -
【设计模式】抽象工厂模式(Abstract Factory Pattern)
???? 核心一个工厂能够根据需要产生不同的产品。如果是根据参数生产产品,则称为简单工厂模式;定义一个创建对象的工厂接口,其子类自己已经决定好了生产哪一种产品,则称为工厂模式;这个子类工厂能生产一套产品。则称为抽象工厂模式。 ???? 问题场景你现在正在为一个电脑设备商店开发系统。最初的需求是,工厂可以根据订单生产不同品牌的 电脑 。你三下五除二,写出了一个 电脑设备工厂 ,这个工厂可以根据传入的参数生产出不同品牌的电脑,联想啊,苹果啊…你想了想,一个工厂能生产两种品牌原创 2021-08-17 13:38:51 · 244 阅读 · 0 评论 -
【设计模式】工厂模式(Factory Pattern)
???? 核心一个工厂能够根据需要产生不同的产品。如果是根据参数生产产品,则称为简单工厂模式;定义一个创建对象的工厂接口,其子类自己已经决定好了生产哪一种产品,则称为工厂模式;这个子类工厂能生产一套产品。则称为抽象工厂模式。 ???? 问题场景还记得吗,在上一篇文章里,你开放了一款物流管理系统。由于这款应用极其受欢迎,陆地运输公司、海路运输公司、航空运输公司都想要与你合作。于是,你创建了一个运输工厂,工厂根据不同的订单,生产并开始一个个 卡车运输 、 轮船运输 、飞机原创 2021-08-17 13:37:25 · 220 阅读 · 0 评论 -
【设计模式】简单工厂模式(Simple Factory Pattern)
???? 核心定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类。就像一个工厂能够根据需要产生不同的产品。 ???? 问题场景你开发了一款物流管理系统。最初的版本是为卡车运输设计的,所以大部分代码都是针对名为卡车的类写的。一段时间后,这款应用非常受欢迎,许多海运公司也向你抛出橄榄枝。这是个好消息。可是…大部分代码都是针对卡车类写的,这时又需要新加入一个轮船类…这时,你又接到了多家航空公司的电话… ???? 解决方案工厂方法的一个显著特征是,创建原创 2021-08-17 13:36:17 · 189 阅读 · 0 评论