设计模式
帅到被人砍啊
发表的文章都是个人的小总结未必全对如果有疑问请大虾们多多指教啊
展开
-
设计模式原则总结
设计代码的指导思想: 1、可维护性 修改功能,改动的地方越少,可维护性越好 2、可复用性 总结一些可复用的类库 3、可扩展性 添加功能,无需修改原来的代码 4、灵活性 代码/接口可以灵活被调用,多重载 设计的六大原则: 1、单一职责原则 高内聚,低耦合 一个类不要太大,不要太累,负责单一内容,别的类通过聚合它来实现引用。 2、开闭原则 对扩展开放,对修改关闭。 抽象化,多态是开闭原则实现的关键。 3、里氏替换原则 ...原创 2021-01-26 18:21:30 · 102 阅读 · 0 评论 -
state状态模式
当我们有个对象,里面有很多操作是根据某个状态值的变化进行执行具体动作的,这个时候,可以把状态抽象出去,对象中聚合一个状态接口的引用,状态接口中定义不同的操作,根据不同的状态值,定义不同的实现类,在具体实现类中,实现具体的操作。跟visitor很相似。 类图: ...原创 2021-01-26 16:59:16 · 129 阅读 · 0 评论 -
TemplateMethod模板方法
模板方法,实际上就是所谓的钩子函数。就是有一个工序,这个工序里面会有多个操作按顺序进行,这样就可以定一个抽象类,将工序作为模板方法,将具体的操作放到模板方法中。具体实现抽象类的类,可以重新操作方法,调用模板方法,就可以按重新的操作方法进行执行。 public class MainTemplateMethod { public static void main(String[] args) { Parent p = new Parent(); p.eat();原创 2021-01-26 16:50:38 · 91 阅读 · 0 评论 -
memento 备忘录模式
这个模式主要用于存档和读档,就是存储某个对象当前的状态,然后在某个操作之后进行读取当前的状态。 可以使用ObjectOutputStream和ObjectInputStream进行存档和读档。 对象必须实现Serializable. 示例代码: ...原创 2021-01-26 16:40:14 · 112 阅读 · 0 评论 -
Prototype原型模式
原型模式就是指clone对象。当我们要克隆一个对象,这个对象需要实现Cloneable接口,并重写object的clone()方法。克隆分为浅克隆和深克隆。针对一个对象中有引用对象的话,引用对象是否克隆,决定了浅克隆还是深克隆。浅克隆只是clone了引用,具体引用指向的对象都是一个。 深克隆的话不仅是克隆的引用,引用所指向的对象也是克隆的。 /** * 浅克隆 */ public class MainPrototype { public static void main(String[.原创 2021-01-26 16:23:21 · 132 阅读 · 0 评论 -
Command命令模式
命令模式是一种行为模式。 一般命令会有两种操作,执行和撤销。所以当我们执行一连串的命令之后,撤销也是从最后一个命令开始的。是一种FILO的模式,所以对于一种Command,有do和undo,当有一连串Command的时候,就需要放到栈中存储,是一种责任链模式了。 类图: ...原创 2021-01-26 15:30:43 · 129 阅读 · 0 评论 -
bridge桥接模式
桥接模式是一种结构性模式。当你有两个或多个产品维度,但是他们之间还有一定联系的时候,可以用桥接模式。所谓桥接,就是采用聚合,将一个产品抽象聚合到另一个产品抽象中。客户端访问聚合者的时候,新建一个被聚合者并传入聚合者中即可。 public class MainBridge { public static void main(String[] args) { GiftType gt1 = new WarmGift(new Flower()); gt1.printN原创 2021-01-26 15:24:37 · 180 阅读 · 0 评论 -
Adapter适配器模式
适配器模式是一种结构性模式,就像我们现实中的两通或者三通。 比较常见的adapter模式是JDBC-ODBC,还有InputStreamReader public class MainAdapter { public static void main(String[] args) throws IOException { InputStream is = new FileInputStream(new File("D:\\test.txt")); Input原创 2021-01-26 14:44:10 · 105 阅读 · 0 评论 -
Builder模式
Builder生成器模式。 这种模式是创建型模式,是对于一个复杂对象创建比较有用。所谓复杂对象就是一个类中有很多的属性,实例化一个类的时候,需要赋值很多属性。其实对于这种模式,我觉得在实际开发中,对于对象属性赋值的set方法修改下返回值就行,让直接返回对象本身即可,实际上是编程的一种技巧而已。 public class MainTestBuilder { public static void main(String[] args) { Products p = new Pr原创 2021-01-26 14:24:19 · 137 阅读 · 0 评论 -
Visitor模式
访问者模式。 场景:对于一个产品,有相对固定的子产品,子产品对于不同的情况下,有类似的处理的时候,用访问者模式相对好些。举个例子一个电脑,里面有cpu,keyboard,Indicator部件,当不同的人买的话,价格可能不一样,个人买的话cpu打9折,keyboard打95折,Indicator打9折; 当企业买的时候,cpu打7折,keyboard打8折,Indecator打6折。 类图: 在java设计中,有句话叫封装变化,就是对变化的部分进行封装起来。此例中,变化的对象就是不同的访问者,变化原创 2021-01-26 13:54:14 · 98 阅读 · 0 评论 -
Iterator迭代器模式
数据结构分为物理结构和逻辑结构 逻辑结构比如二叉树、List、 stack、 队列 、 b树 、 图 物理结构只有两种:数组和链表 逻辑结构的底层都是由这两种物理结构的一种或两种组合实现。 迭代器模式就是处理集合遍历的。Iterator接口提供hasNext和next方法。各个集合自己内部实现Iterator接口,根据自己的物理结构,实现hasNext和next方法。 public class ListTest { public static void main(String[]原创 2021-01-22 11:21:34 · 80 阅读 · 0 评论 -
Proxy代理模式
代理分为静态代理和动态代理。 1、静态代理 就是创建一个代理类,把要代理的对象聚合到代理类中。实际调用者调用的是代理类的方法,代理类的方法调用的是被代理者的方法,这样在代理类的方法里面,可以做些其他的操作。 Decorator装饰模式,其实就是一种代理方式。 代理类和被代理类实现相同的接口,将接口聚合到代理类中,可以实现代理的嵌套。 2、动态代理 动态代理有两种:jdk的动态代理和cglib动态代理。 1)jdk动态代理使用的是Proxy.newProxyInstance()来创建对象。原创 2021-01-21 14:33:03 · 223 阅读 · 0 评论 -
Facade, Mediator, Composite, Flyweight
1、Facade 外观/门面模式。 Facade就是抽象出对外的接口层,由此实现访问端和业务端的关联。外观(Facade)提供了一种访问特定子系统功能的便捷方式,其了解如何重定向客户端请求,知晓如何操作一切活动部件。 我觉得nginx其实就一个系统的Facade。 2、Mediator 中介者模式 Mediator跟Facade有点类似,Facade是外部访问者与系统内部组件之间解耦的, Mediator是系统内部子系统之间的解耦。 我觉得消息中间件MQ,注册中心eureka都算是M...原创 2021-01-21 10:36:41 · 83 阅读 · 0 评论 -
Observer观察者模式
观察者模式是一种行为设计模式,应用比较广泛。他跟钩子函数、回调函数其实是一回事。 观察者的调用类图: 上面这种方式,没有抽象出单独的事件。还有一种方式,可以将事件单独抽象出来,观察者接收到事件之后,根据事件作出响应 示例代码:小孩哭的时候,爸爸哄哄,妈妈喂喂 public class Main { public static void main(String[] args) { //创建观察者的管理者类,并添加观察者 ObserverManager原创 2021-01-20 17:46:53 · 177 阅读 · 0 评论 -
Chain of Responsibility 责任链模式
责任链模式是一种行为设计模式。常用在多重校验的场景。举个简单的例子,在我们项目中经常会有数据有效性检查的操作,比如我们要对数据进行处理,我们需要校验类别信息是否有重复、单位信息是否有重复、商品信息是否有重复等等,这个时候,我们就可以利用责任链模式,将各种产品的验证串到一个链条上进行依次验证。 类图如下: ...原创 2021-01-20 16:19:26 · 117 阅读 · 1 评论 -
Decorator装饰器模式
装饰器模式是一种结构型模式。 举个例子,比如说我们现在有一些没有皮肤的英雄,我们可以给这些英雄加点服饰,比如说戴个帽子,穿双鞋子等 简单来讲就是采用聚合方式,装饰器中聚合Hero,执行hero的方法的同时进行添加所需的装饰。 示例代码: public abstract class Hero { public abstract void showSkin(); } public abstract class HeroDecorator extends Hero { pub原创 2021-01-18 18:20:02 · 66 阅读 · 0 评论 -
工厂模式总结
工厂是用来生产对象的,也就是把new Object()操作放到了工厂里面。 工厂模式分为简单工厂、工厂方法,抽象工厂。 简单工厂就是建一个工厂类,里面包含各种产品对象的创建方法。 优点:简单,类少 缺点:扩展性不好,管理的事情比较多 工厂方法就是为每一种产品提供一个工厂类去创建,各产品的创建逻辑,在各产品工厂类中去实现。 优点:对产品横向扩展性好 缺点:类多,多个产品的组合情况比较麻烦 抽象工厂就是为每个产品提供一个抽象类,并为一族产品(多个抽象产品的组合)提供工厂类,这个工厂类..原创 2021-01-11 12:56:02 · 70 阅读 · 0 评论 -
抽象工厂模式(补充图)
之前有篇文章是概述了抽象工厂的实现。其实用抽象类或者接口来实现抽象层都是可以的,实际用的过程中可以结合自己的业务怎么方便怎么来。下面画了一下抽象工厂实现图:原创 2020-11-24 13:54:56 · 113 阅读 · 0 评论 -
策略模式
策略模式是一种行为设计模式。它将一个或一组行为抽象为对象,并使其在上线文内部能够相互转换。 策略模式的使用方法: 1、定义一个通用的策略接口,将通用的行为方法定义到接口中。 2、创建不同行为方式的类,实现策略接口并实现行为方法。 3、在上下文类中(一般是service类)中定义策略接口引用,然后引用执行行为方法即可。然后我们就可以根据业务的不同参数,将接口引用实例为不同的行为方式类的对象。这样子在实际运行中,实例化不同的类,就会走各自实现的策略行为方法。 ...原创 2020-11-23 15:17:00 · 93 阅读 · 0 评论 -
设计模式之单例模式的几种写法
单例顾名思义就是只会有单个实例。 这里介绍四种单例的写法: 1、饿汉式(推荐,因为简单实用) /** * 单例模式 饿汉 简单实用 * @author wangkai * @date 2020-06-24 13:02 */ public class SingleTon { private static SingleTon INSTANCE = new SingleTon(); private SingleTon(){} public static SingleTon原创 2020-11-20 17:43:03 · 75 阅读 · 0 评论 -
建造者(Builder)模式
当一个对象有很多属性,对属性赋值时,有两种方式,一种是set,一种是构造函数。 通过构造函数的话,属性越多,构造函数不同的场景下需要不同的参数,也就可能会有越多。这个时候,通过建造者模式会比较方面,不同的对象需要不同的属性,只对需要的属性赋值即可。 实现建造者模式的方式有很多种。在此介绍其中两种。 第一种:通用生成器+主管方式 实现步骤: 1、创建通用生成器接口,接口中声明对象属性赋值的方法。 2、创建具体对象类 3、创建具体对象生成器类,实现通用生成器接口。 3.1 在类中,声...原创 2020-08-12 18:21:28 · 265 阅读 · 0 评论 -
抽象工厂(Abstract Factory)模式
抽象工厂也是一种创建型模式,它是用来处理多种产品相互组合的场景。 实现步骤: 1、首先创建不同类型产品的各自的通用产品接口,并创建各自具体实现的产品类。 2、创建一个通用的抽象工厂接口,在接口中定义不同产品类型的通用接口的创建方法,返回类型为各通用产品接口类型。 3、创建不同的具体的工厂类,实现工厂接口,并实现工厂接口方法,创建具体的产品。 4、创建客户端应用所需的类,这个类中,声明了通用产品接口对象为成员变量, 声明有参构造函数,参数是通用抽象工厂接口对象, 在构造函数中,将产品接口对象通过调用原创 2020-08-07 11:40:27 · 113 阅读 · 0 评论 -
工厂方法模式(Factory Method)
工厂方法模式,是一种创建型设计模式,顾名思义就是用来创建对象用的。 工厂方法定义了一个方法,且必须使用该方法代替通过直接调用构造函数来创建对象(new操作符)的方式。子类可重写该方法来更改将被创建的对象所属类。 其实现步骤: 1、定义一类产品的通用接口,该接口必须声明对该类所有产品都有意义的方法。 2、创建各自产品的类,实现产品通用接口,并实现接口方法。 3、定义一个抽象的工厂类, 工厂类中定义一个抽象的创建产品的工厂方法,返回类型是产品通用接口类型,方法名是创建产品,这样就由工厂子类...原创 2020-08-07 11:17:12 · 168 阅读 · 0 评论 -
设计模式之恋
推荐一个讲解设计模式的网站:https://refactoringguru.cn/design-patterns/catalog 根据流行度,统计了下22中设计模式: 流行度三星 流行度二星 流行度一星 工厂方法模式 原型模式 桥接模式 抽象工厂模式 单例模式 享元模式 生成器模式 组合模式 代理模式 适配器模式 装饰模式 责任链模式 命令模式 外观模式 备忘录模式 迭代器模式 中介者模式 访问.原创 2020-08-03 16:05:45 · 120 阅读 · 0 评论