设计模式
文章平均质量分 53
jinyangjie0
学如逆水行舟,不进则退
展开
-
设计模式-代理模式
一、定义代理模式,为另一个对象提供一个替身或占位符以控制对这个对象的访问。二、代理模式变体远程代理远程代理可以作为另一个JVM上对象的本地代表。调用代理的方法,会被代理利用网络转发到远程执行,并且结果会通过网络返回给代理,再由代理将结果转给客户。虚拟代理虚拟代理作为创建开销大的对象的代表。虚拟代理经常直到我们真正需要一个对象的时候才创建它。当对象在创建前和创建中时,由虚拟代理来扮演对象的替身。对象创建后,代理就会将请求直接委托给对象。保护代理一种根据访问权限决定客户可否访问对象的代理。防火原创 2022-03-22 15:30:43 · 166 阅读 · 0 评论 -
设计模式-状态模式
定义状态模式,允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,行为会随着内部状态而改变。实例以糖果机为例,自动售卖糖果。糖果机工作状态流程:没有25分钱—》投入25分钱—》有25分钱—》转动曲柄—》售出糖果—》发放糖果,如果此时糖果数目等于0,则变成糖果售罄,否则返回没有25分钱状态。其中,在投入25分钱,未转动曲柄前,可退回25分钱。在糖果售罄状态时,不能投25分钱。很明显,这个例子有4个状态:没有25分原创 2022-03-17 11:40:16 · 637 阅读 · 0 评论 -
HeadFirst设计模式-组合模式
定义组合模式,允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。实例继续以餐厅和煎饼屋合并的例子为例。前面说到,餐厅菜单用ArrayList实现,煎饼屋菜单用数组,合并后两个都不想改变自己的实现,那么我们通过迭代器模式,统一了这两种实现,完成菜单遍历功能。现在,餐厅需要在菜单上加个小菜单,甜品菜单。它包含在餐厅菜单里,所以无法用迭代器模式完成。那么,试试组合模式。将甜品菜单看做是组件,组合到餐厅菜单中。餐厅菜单和甜品菜单都继承MenuCom原创 2022-03-16 10:20:26 · 236 阅读 · 0 评论 -
HeadFirst设计模式-迭代器模式
定义迭代器模式,提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。实例对象村餐厅和对象村煎饼屋要合并了。这是个好消息,但是煎饼屋使用ArrayList记录菜单项,餐厅使用数组记录菜单项。他们两个都不愿意改变实现,因为有太多的代码依赖于它们了。但至少它们都同意实现MenuItem。public class MenuItem { String name; String description; String vegetarian; double pr原创 2022-03-14 22:27:23 · 631 阅读 · 0 评论 -
HeadFirst设计模式-模板方法模式
定义模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。实例以星巴克咖啡师训练手册为例。星巴克咖啡冲泡法:(1)把水煮沸(2)用沸水冲泡咖啡(3)把咖啡倒进杯子(4)加糖和牛奶星巴克茶冲泡法:(1)把水煮沸(2)用沸水浸泡茶叶(3)把茶倒进杯子(4)加柠檬咖啡和茶的冲泡法大致上一样的。如果分开实现咖啡和茶的冲泡方法,则会发现有不少重复代码。既然咖啡和茶是如此地相似,我们应该将共同的部分抽取原创 2022-03-11 23:18:26 · 422 阅读 · 0 评论 -
HeadFirst设计模式-外观模式
定义外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。实例以家庭影院为例,准备放松准备开始感受电影的魔幻魅力。可能需要的步骤:开始爆米花将灯光调暗放下屏幕打开投影机切换输入源设置环绕立体声开始播放电影需要不少的步骤才能开始观看电影。但还不只这样。看完电影后,你还要把一切都关掉,要反向地把这一切动作再进行一次。如果要听广播,难道也这么麻烦?如果你决定升级系统,可能还必须重新学习一套稍微不同的操作过程。使用家庭原创 2022-03-07 10:57:48 · 388 阅读 · 0 评论 -
HeadFirst设计模式-适配器模式
定义适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。适配器是什么,你一定不难理解,因为现实中到处都是。比方说,如果你需要在欧洲国家使用美国制造的笔记本电脑,你可能需要使用一个交流电的适配器。你知道适配器的作用:它位于美式插头和欧式插座的中间,它的工作是将欧式插座转换成美式插座,好让美式插头可以插进这个插座得到电力。或者也可以这么认为:适配器改变了插座的接口,以符合美式笔记本电脑的需求。实例以之前讲过的鸭子为例。public interface Du原创 2022-03-06 21:47:40 · 220 阅读 · 0 评论 -
HeadFirst设计模式-命令模式
定义命令模式——将请求封装成对象,这可以让你使用不同的请求、队列,或者日志请求来参数化其他对象。命令模式也可以支持撤销操作。实例餐厅点餐以餐厅为例,顾客点餐,服务员记录订单,后移交给后厨制作。服务员是不用具体知道菜品是如何制作的,只需要记录下菜名,移交给后厨。服务员实际上将顾客和后厨解耦了,他们之间通过一个个菜品名,即一个个命令产生联系。不同的菜品可以互相组合,同样命令也可以互相组合。下面列出餐厅对象与命令模式对象的对应关系:餐厅命令模式顾客Client订单Comm原创 2022-03-03 16:38:26 · 289 阅读 · 0 评论 -
HeadFirst设计模式-工厂模式(7)-总结
定义工厂方法模式——定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。抽象工厂模式——提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。要点所有的工厂都是用来封装对象的创建。简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦。工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中。所有工厂模式都通原创 2022-03-01 20:43:15 · 225 阅读 · 0 评论 -
HeadFirst设计模式-工厂模式(6)-工厂方法和抽象工厂的区别
工厂方法和抽象工厂都是工厂模式,它们间有相似的地方,常常被人们搞混。工厂方法模式工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。abstract Product factoryMethod(String type)抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。两者都能把应用程序从特定实现中解耦,都负责创建对象,但是做法不同。两者区别实现方式不同工厂方法使用类,即使用继承的方法。工厂方法创建对象,需要原创 2022-03-01 20:21:08 · 184 阅读 · 0 评论 -
HeadFirst设计模式-工厂模式(5)-抽象工厂
接上文。重做披萨现在已经有了一个抽象比萨,可以开始创建具体披萨子类了。子类间唯一的区别在于使用区域性的原料,至于比萨的做法都一样(面团+酱料+芝士),其他的比萨(蔬菜、蛤蜊等)也是如此。它们都依循着相同的准备步骤,只是使用不同的原料。所以,我们不需要设计两个不同的类来处理不同风味的比萨,让原料工厂处理这个区域差异就可以了。下面是CheesePizza:public class CheesePizza extends Pizza { PizzaIngredientFactory ingredi原创 2022-02-26 22:13:32 · 207 阅读 · 0 评论 -
HeadFirst设计模式-工厂模式(4)-抽象工厂
接上文。确保原料的一致你打算建造一家生产原料的工厂,并将原料运送到各家加盟店。但是加盟店在不同的区域,酱料是不一样的。你需要准备不同的原料。考虑到未来的扩展,你需要各个地区的原料。建造原料工厂现在,我们要建造一个工厂来生产原料。这个工厂将负责创建原料家族中的每一种原料。开始先为工厂定义个接口,这个接口负责创建所有的原料:public interface PizzaIngredientFactory { // 接口中,每个原料都有一个对应的方法创建该原料 // 这里有许多新类,每个原创 2022-02-26 21:54:31 · 193 阅读 · 0 评论 -
HeadFirst设计模式-工厂模式(3)-工厂方法
接上文。披萨店改造的做法实际是“工厂方法”设计模式,原本由一个对象负责所有具体类的实例化,现在通过对PizzaStore做一些转变,变成由一群子类类负责实例化。工厂方法模式工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。abstract Product factoryMethod(String type)工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样,客户程序中伏案与超类的代码就和子类对象创建代码解耦了。代码里减少对于具原创 2022-02-25 21:17:55 · 188 阅读 · 0 评论 -
HeadFirst设计模式-工厂模式(2)-工厂方法
接上文。加盟比萨店由于比萨店经营有成,开始有了加盟店。身为加盟公司经营者,你希望确保加盟店营运的质量,所以希望这些店都使用你那些经过时间考验的代码。但是每家加盟店都可能想要提供不同风味的比萨(比如说纽约、芝加哥、加州)。比如一家加盟店希望工厂能知道纽约风味的比萨:博饼、美味的酱料和少量的芝士。另一家加盟店希望工厂能制造芝加哥风味的比萨:厚饼、重味的酱料和大量的芝士。不仅风味不同,还有些自创的流程:烘烤的做法有些差异、不要切片、使用其他厂商的盒子等。下面的做法可让比萨制作活动局限于PizzaStore原创 2022-02-25 20:36:33 · 219 阅读 · 0 评论 -
HeadFirst设计模式-工厂模式(1)-简单工厂
工厂模式解决初始化经常造成耦合的问题,将你从复杂的依赖中脱困。实例化对象时,会使用new,但这是针对实现编程,而不是接口。这样让代码绑着具体类,会导致代码更脆弱,缺乏弹性。在技术上,new没有错,毕竟这是Java的基础部分。真正令人犯难的是“改变”。需要找出会变化的方面,把它们从不变的部分分离出来。比萨店实例假设你有一个比萨店,制作比萨的初始代码:Pizza orderPizza() { Pizza pizza = new Pizza(); pizza.prepare()原创 2022-02-24 19:50:40 · 349 阅读 · 0 评论 -
HeadFirst设计模式-装饰者模式(下)
接上文。真实世界的装饰者:Java I/Ojava.io包内的类太多了,简直是排山倒海。现在,你已经知道装饰者模式,这些I/O的相关类对你来说应该更有意义了,因为其中许多类都是装饰者。例如:BufferedInputStream及LineNumberInputStream都扩展自FilterInputStream,而FilterInputStream是一个抽象的装饰类。而FileInputStream和FilterInputStream都扩展自InputSteam类,InputSteam也是个装饰原创 2022-02-24 01:08:25 · 283 阅读 · 0 评论 -
HeadFirst设计模式-装饰者模式(中)
接上文。我们知道,利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。这里引出一个很重要的设计原则,开闭原则设计原则类应该对扩展开放,对修改关闭。我们的目标是允许类容易扩展,在不修改现有代码的情况下,就可搭配新的行为。这样的设计具有弹性,可以应对改变,可以接收新的功能来应对改变的需求。下面来看用装饰者模式是如何实现开闭原则的。装饰者模式方案我们已经了解利用继承无法完全解决问题,所以,这原创 2022-02-22 21:17:56 · 234 阅读 · 0 评论 -
HeadFirst设计模式-装饰者模式(上)
概述装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。即组合的方案。使用装饰者,你将能够在不修改任何底层代码的情况下,给对象赋予新的职责。咖啡店实例以咖啡店为实例,讲解装饰者模式的使用。一家咖啡店的扩张速度很快,他们准备更新订单系统,以符合他们的饮料供应要求。他们原先的设计是这样的,Beverage(饮料)是一个抽象类,店内所提供的饮料都必须继承此类。该类主要有两个方法:getDescription()获取描述的方法,由每个子类设置,用来描述饮料,例原创 2022-02-22 21:04:59 · 263 阅读 · 0 评论 -
HeadFirst设计模式-观察者模式(下)
接上篇。观察者模式实现的气象站WeatherData类作为主题,需要实现观察者的注册、删除以及通知方法。public class WeatherData { // 实例变量声明 public void measurementsChanged() { // 存放观察者 private ArrayList observers; private float temp = getTemperature(); private flo原创 2022-02-21 20:25:23 · 219 阅读 · 0 评论 -
HeadFirst设计模式-观察者模式(上)
概述观察者模式定义了对象之间的一对多依赖,使得当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。可以用报纸订阅服务,出版者和订阅者比拟观察者模式。出版者改称为主题,订阅者改称为观察者。出版者+订阅者=观察者模式观察者模式实现了一种设计原则:设计原则为了交互对象之间的松耦合设计而努力。观察者模式让主题和观察者之间可以交互,但是不需清楚彼此的细节,是一种松耦合结构。主题只知道观察者实现了某个接口(也就是Observer接口)。主题不需要知道观察者的具体类是谁、做了些什么或其它任何细节原创 2022-02-21 20:00:47 · 217 阅读 · 0 评论 -
HeadFirst设计模式-策略模式-鸭子类的策略模式实现
接《HeadFirst设计模式-策略模式-鸭子类的常规实现》上文,当前场景下,推荐做法是使用组合。引入一个设计原则:设计原则找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。这里会经常发生变化的是飞行和叫声行为,则将这两个行为抽出单独成类。飞行行为flyBehavior,叫声行为quackBehavior。那么,具体如何设计这两个行为呢。我们希望一切都能有弹性,毕竟,正是因为一开始的鸭子行为没有弹性,才让我们走上现在这条路。我们还想能够指定行为到鸭子的实例。比如,原创 2022-02-20 21:33:02 · 404 阅读 · 0 评论 -
HeadFirst设计模式-策略模式-鸭子类的常规实现
概述策略模式,定义了多个算法类,或者说多个策略类,运行时可以选择任一种算法进行替换。该模式让算法与使用算法的客户解耦,让算法的变化独立于使用算法的客户。鸭子具体实例以一个具体的例子说明,我们需要设计一个鸭子类,来描述不同鸭子的不同行为。按照常规思维,是先定义一个鸭子duck类,具有外形display()和游泳swim()、叫声quack()的行为,然后具体的红头鸭和绿头鸭继承duck类,只需覆盖重写外形display(),游泳和叫声行为不用写代码,就可继承而来。新增鸭子行为现在新增一个需求,要求原创 2022-02-20 21:09:14 · 487 阅读 · 0 评论 -
设计模式-有效学习的方法
学习是件不容易的事情,可以用下面的方法,让你的大脑就范。1、慢一点,你理解的越多,需要记得就越少不要光只是看看,停下来,好好思考理解。书中提出问题的时候,不要直接去看答案。你让大脑想得越深,就越有可能学会并记住。2、勤做练习,自己记笔记书中留了练习,不要只是坐着看着练习发呆,那出笔来,写一些、画一画。大量研究都证实,学习过程中如果能实际动动手,将改善你的学习效果。3、阅读被重点标注的部分,不能跳过重点标注的内容不是可有可无的,它们绝对是核心内容的一部分。千万不要把它们跳过去不看。4、上床睡觉前原创 2022-02-19 21:57:53 · 349 阅读 · 1 评论 -
设计模式-关于如何学习的引言
《HeadFirst设计模式》是本非常棒的书,它用生动的语言,拟人化的描述,丰富有趣的图示,将枯燥乏味的设计模式变得容易理解。本系列是《HeadFirst设计模式》的学习笔记学习是件枯燥的事件,特别是学习技术内容,容易困乏。我们知道,大脑一直会注意周围的环境,那么如何让大脑认为当前所做的学习这件事是件紧迫、重要的事,从而努力把不重要的内容赶走,保证这些东西不去侵占本不算充足的脑力资源呢?如果你是正待在家里或者坐在图书馆里,安静的环境有助于减少干扰因素。如果你需要应付考试,或者在学一项比较难的新技原创 2022-02-19 20:49:19 · 206 阅读 · 0 评论 -
设计模式-单例模式
单例模式,是在实际工作和面试中比较常见的模式,下面我们来学习单例模式的几种实现方法。原创 2021-12-13 17:18:07 · 345 阅读 · 0 评论 -
设计模式-六大原则
1、单一职责;2、接口隔离原则;3、依赖倒转原则;4、里式替换原则;5、开闭原则;6、迪米特法则原创 2021-12-13 10:34:27 · 218 阅读 · 0 评论