![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
你huai哦
一只学习大数据的菜鸟
展开
-
设计模式——状态模式
场景引入 生活中,对于同一件事,根据我们当时的所处心情不同,我们会做出不一样的行为。就类似:以我观物,物皆著我之色彩。所谓的状态模式就是这样,一个类中方法根据状态的不同,而采取不一样的行为。比如:你的心情有:开心、生气。然后行为有:笑、哭。一般的实现方法就如下面的代码: public class Person { private String state; public Person(String state) { this.state = state; }原创 2020-08-04 15:17:28 · 125 阅读 · 0 评论 -
设计模式——模板方法
场景引入 说到模板方法,最好理解的就是英语写作的模板了。在各种英文写作中,面对作文,我们都会选择去背模板。拿我们英语作文的模板来说,如果我们把每一句话都记下来的话,那么适用面肯定是很窄的。而有些人的模板就是这样: 第一段: 1 主语从句 第二段: 2.1 强调句总写引出事件的原因 2.2 使用Not only…but also句式阐述具体原因 第三段: 3 定义从句加插入语总结全文 就以上这样的一个模板,可以说,其适用面就很广。因为其比较抽象,而不是特别具体。这样每个人就能根据自己的情况和具体话题进行扩原创 2020-08-03 15:39:52 · 97 阅读 · 0 评论 -
设计模式——备忘录模式
场景引入 所谓备忘录,简单来说就是我们在生活中为了记录一件事情而写在记事本上。所以备忘录模式就是为了保存对象的内部状态,以便在之后的操作中可以返回到这个状态。就像是Linux系统中的快照,windows系统中还原点。这个模式的出发点就是:不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。 UML图 originator(发起者):发起者是我们需要记住状态的对象,以便在某个时刻恢复他 CareTakere(管理者):负责触发发起者的变化或触发发原创 2020-08-02 18:57:27 · 137 阅读 · 0 评论 -
设计模式——原型模式
场景模式 在现在的工厂生产中,我们生产的产品都是大同小异的。即基本上都是相同的。在这种情况下,如果每次生产一个产品都要我们自己手动的去输入参数,相当于自己去new一个,那么就会显得很麻烦。那么我们想到的最好的办法就是用克隆的办法去从一个对象生成另一个和此对象相同的对象。原型模式就是我们说到的克隆。即根据一个对象生成一个与此对象一摸一样的对象。 注:因为java中是存在实现原型模式的接口的,即Cloneable。如果有些语言没有,就是一个接口,里面有一个抽象的clone方法。但是在java中cloneable原创 2020-08-01 15:28:02 · 126 阅读 · 0 评论 -
设计模式——命令模式
场景引入 这样一个场景:我们要吃饭,那么在家的情况下就需要我们要自己去做饭,然后才能吃到饭。但是如果我们现在在餐厅的话,我们只需要点菜就可以吃到饭。在家做饭的过程就相当于餐厅厨师做法的过程,属于执行。那么在家做法就相当于自己给自己下命令,然后自己去执行命令的过程。就是你自己告诉你自己:我要吃小龙虾,然后你自己去做小龙虾;我要吃面条,然后你要自己去做面条。但是你在餐厅就不一样,你只要说:我要吃小龙虾,你只要告诉老板,你就能吃到小龙虾;你要吃面条,你告诉老板,你也能吃到。这就相当于把请求和执行的过程进行了分开。原创 2020-07-31 20:53:59 · 82 阅读 · 0 评论 -
设计模式——桥接模式
场景引入 假设这样一种场景:当你身边有朋友过生日时,你会去给他(她)挑选礼物。那么我们在选礼物时,肯定会根据朋友的性别来给朋友选礼物。如果朋友是女性,你就会挑选适合女生的礼物(WomenGift);如果朋友是男性,你就会挑选适合男生的礼物(ManGift)。但是具体的礼物,比如书(Book)、花(Flower)这种其实都是适合送给男生和女生的。但是女生和男生的花和书又有很大的不同。这时,就相当于构成了下图: 如果按照只用继承去实现,那么就需要22=4的实现类,如果第一层的类别不断增加,比如有m种,第二层的类原创 2020-07-30 20:31:26 · 119 阅读 · 0 评论 -
设计模式——适配器模式
场景引入 想象这样一个场景:在之前的手机上面都是有一个耳机孔的,但是现在却逐渐的取消,只有一个type接口。在这种情况下,我们需要一个type接口的转化器。在这种情况下,解决方法就有两种:1)将耳机的插口也换成type的;2)为了使之前的耳机还能使用,我们需要一个转接口。即一边是插入type接口的,一边是插入那种圆形的耳机的。解决方案二中的转接器其实就是一个适配器。其将一些老的接口进行适配从而可以满足新的接口需求。 代码实现 Earphone interface public class Earphone原创 2020-07-25 22:06:31 · 65 阅读 · 0 评论 -
设计模式——建造者模式
场景 在生活中,有时候存在一个很大的实体,其有很多的属性,其构造起来起来就很复杂。这时候,我们可以将这个很大的实体进行拆分,拆分很多部分进行构造。比如:在生产一辆汽车的时候,其属性就有很多。比如轮胎的材质,轮胎的大小,发动机的类型,发动的品牌,车架的材质,车架的颜色。。。。等很多属性。如果我们在生产一个汽车时,要指定这么多参数,必然十分的复杂。这时候,我们就将汽车拆着轮胎、车架、发动机等部分进行构造。然后最后再将这些部分组装起来即可。为了方便,这里的汽车构造就看成是三个部分进行组成的。分别为轮胎tyre、发原创 2020-07-24 20:41:43 · 78 阅读 · 0 评论 -
设计模式——访问者模式
场景引入 想象这样一个生活实例:假设在每个大型商场中,有奶茶店、衣服店以及超市组成。对于这些店而言,他们都有一个浏览店铺的方法visit()方法。但是作为每一个顾客而言,店家不会根据每个具体的人来给不同的访问方式,比如:针对一个小孩子,就把店铺转化为玩具店,针对女性顾客,就把店转化为化妆品店。即店是固定的,里面的东西是固定。这时候,就需要顾客自己去店里表明自己的需求,即顾客自己要实现浏览店铺的行为,针对不同的店实现不同的行为。 代码实现 shop interface public interface Sho原创 2020-07-23 18:30:08 · 84 阅读 · 0 评论 -
设计模式——迭代器模式
场景引入 在数据结构中,我们知道:对于顺序存储和非顺序存储,他们遍历元素的方式是不一样的。既然遍历的方式不同,那么就有不同的迭代元素的方式。那么 如果我把迭代数据的方式抽取出来,作为一个新的类或者接口,那么针对每一种存储结构,他都应该实现这个接口,在里面实现自己迭代数据的方式。这样使我们不用去了解底层的实现原理,而可以把不同情况下的迭代看成是一样的。 模式优点 访问一个聚合对象的内容而无须暴露它的内部表示。 遍历任务交由迭代器完成,这简化了聚合类。 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类原创 2020-07-20 23:20:12 · 67 阅读 · 0 评论 -
设计模式——代理模式
场景引入 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。生活中就是:你去买电脑,不会直接去厂家进行购买,而会去专卖店或者零售店进行购买,此时专卖店或者零售店就是代理对象,他给你进行购买电脑的操作。 关键 代理对象中存在由被代理的对象,就好比专卖店有你要的电脑 代理对象和实际对象继承相同的方法 模式优点 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用; 代理对象可以扩展目标对象的原创 2020-07-18 15:34:17 · 108 阅读 · 0 评论 -
设计模式——享元模式
场景引入 享元模式:所谓享元就是共享元素。因为在java语言中,生成一个新的对象其实是需要时间的。为了减少创建对象的时间,我们可以预先将需要的对象先创建出来。这样就可以减少所需要的时间。既然是先创建对象,那我们所需要的对象的数量就不能太多,否则非常的占用内存空间。因为享元模式创建出现的对象,除非主程序关闭,否则对象是一直存在的,并不会被垃圾收集机制进行收集。生活中的例子:下围棋,因为围棋只有两个颜色的棋子,我们就将可以将下围棋抽象成两个类:一个是棋子(chess)类,一个是位置(Location)类。棋子类原创 2020-07-16 11:25:00 · 108 阅读 · 0 评论 -
设计模式——组合模式
前提知识 Linux操作系统中将文件夹当作文件进行处理。 场景引入 假如你现在正在使用一台linux操作系统的计算机。现在你要对你所学的知识进行整理。那么你肯定不会创建很多的文件,因为那样子太乱了。当然你也不会全部创建为文件夹,因为那样你没有办法记录自己的学习笔记。最合理的办法就是在整理的时候既有文件又有文件夹。比如下图: 在这种情况下:我们就把文件和文件夹抽象成一个组件,然后这些组件组合在一起就是组合模式。 观察上面的例子,可以得出:文件夹是包含若干文件的,因此在文件夹类中就有:add()、remove(原创 2020-07-11 18:20:48 · 134 阅读 · 0 评论 -
设计模式——观察者模式
场景引入: 想象这样一个场景:你在生活中有很多的朋友,相对于其他人而言,朋友和你很强的联系的。所以,你在生活中遇到了事情,你会去告诉你的朋友。(当然那种说自己很坚强,自己默默承认的人,我就不多说了)。但是在生活中,即便是再怎么要好的朋友,他都不可能一直等着你通知他消息,因为别人也是要生活的。所以,当你自己发生了事情,应该是你来通知你的朋友。即,你有一个通知的方法sendMessage()。这样,你自己就必须要有一个朋友的列表List<Friends>。再想象一下,生活多变,一个人的朋友不会一直不原创 2020-07-10 18:53:21 · 195 阅读 · 0 评论 -
设计模式——责任链模式
应用场景 设想在医院中:每当来了一个病人,首先由实习医生进行诊治;如果实习医生就解决不了,将交给正式医生进行诊治;如果正式医生也解决不了就交给主任进行诊治;依次循环。实习医生->正式医生->主任->...这个就构成了一条责任链。 模式的关键 每个人需要处理的事件事件首先都是交给第一个责任类,就比如例子中的实习医生; 每个责任类必须知道自己的下一个责任类;就比如:实习医生比如要知道自己解决不了要交给正式医生; 代码实现 Doctor.class public abstract class原创 2020-07-09 13:31:45 · 131 阅读 · 1 评论 -
设计模式——装饰器模式
应用场景 在现有的代码中增加或者删除一些功能,同时对现有的代码结构不会造成影响,同时不会添加子类。如果用继承的方式来拓展一个类的功能,因为继承具有静态特征,耦合度高,并且如果用继承,会使子类膨胀。而装饰器的目标就是:使用组合关系来创建一个包装对象来对真实对象进行修饰,从而在保证子结构不变的前提下,为真实对象提供额外的功能。 UML图 优点 采用装饰器模式来拓展对象的功能比采用继承方式更加灵活 可以设计出不同的具体装饰类,创造出多个不同行为的组合 缺点 装饰器增加了很多子类,会使程序变复杂 代码实现 i原创 2020-07-07 15:08:14 · 103 阅读 · 0 评论 -
设计模式——中介者模式
场景引入 想象这样一个场景:在你毕业之前你去找房子,但是在以前没有中介公司的时候,你要一个一个的去找房东,要与大部分房东都要存在联系,这样就相当于构成了数据结构中的网状结构,其中每个实体与其他实体或其他大部分实体都存在交互。但是现在,出现了中介公司,他负责将你要找房子的需求进行转递给房东,将房东需要出租房子的信息传递给租客。这相当于:房东和租客现在都不需要直接建立联系,而是只需要和中介联系就行。就好比将一个网状结构图转化为了一个星状结构图。 概念: 中介者模式:创建一个对象(这就好比是中介公司),这个对象(原创 2020-07-06 15:35:24 · 101 阅读 · 0 评论 -
设计模式——工厂方法模式、抽象工厂模式
模式引入: 工厂:任何可以产生对象的方法或者类。 简单工厂 注:这不属于23中设计模式之一 场景引入 首先,我们想象这样一个场景:创业初期,一个人开了一个工厂生产手机和智能手表。(现实生活中,当然是先生产一个,但是为了好写一些,就假装有两种产品,其实一种产品的也算) 代码实现 device interface /* 接口,用来说明设备的生产过程 */ public interface device { void process(); } phone.class // 手机类,用来说明手机是怎么生原创 2020-07-05 00:28:42 · 186 阅读 · 0 评论 -
设计模型——策略模式
标题 个人感觉就和java中的多态性是差不多原理的,即:先定义一个接口,其中定义了一个抽象方法,比如两个数组的计算操作。然后用一些实现类去实现这个接口,实现其中具体的计算操作,比如有:加、减、乘、除。然后在使用时,我们只需要指定是哪一个具体的实现策略即可。 结构图 代码 策略 public interface strategy<T> { int operate(int o1,int o2); } 策略实现 public class Add implements strategy{原创 2020-07-04 08:38:06 · 697 阅读 · 0 评论 -
设计模式——单例模式
使用场景 一个类只需要生成一个实例对象 关键点 类中对应的构造方法必须为私有方法,这种其外部就不能调用构造方法来构造对象 在类中申明一个类对象,并且用static修饰。 各种单例模式代码 注:第一种、第六种、第七种、第八种值得好好看看 第一种: public class singleton01 { private static final singleton01 INSTANCE = new singleton01(); private singleton01(){}; pu原创 2020-07-02 17:12:06 · 2852 阅读 · 3 评论