facade

设计模式(10) 外观模式

佐手、 提交于 2020-08-09 13:28:54
外观模式(或门面模式、包装模式)是设计模式中非常朴素地体现面向对象“封装”概念的模式,它的基本原理是将复杂的内部实现以统一接口的方式暴露出来,最大程度地减少客户程序对某些子系统内部众多对象的依赖关系。 外观模式在开发过程中运用频率非常高,比如各种第三方SDK大多会使用外观模式。通过一个外观类是的整个系统的接口只有一个统一的高层接口,这样能够降低用户的使用成本,也能够对用户屏蔽很多实现细节。 再比如经常会用到的三层结构也是外观模式的应用。 GOF对外观模式的描述为: Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use. — Design Patterns : Elements of Reusable Object-Oriented Software UML类图: 通过外观模式为子系统中的一组接口提供一个高层接口,该接口使子系统更易于使用。它的主要动机是减少“子系统”内部与外部间对象通信的依赖复杂程度 再比如计算机就是一个通过提供一个高层接口以屏蔽内部复杂性的例子,计算机包括CPU、硬盘、内存等各种部件,但作为用户,不需要与这些零部件打交道

JVM 底层原理总结

梦想与她 提交于 2020-08-07 13:12:06
JAVA虚拟机: 一、如上图所示,JAVA虚拟机运行时主要由以下三个部分构成: A. 本地库接口 负责把描述类的数据从Class文件加载到内存,并对数据进行校验、装换解析、以及初始化,最终形成可以被虚拟机直接使用的Java类型。 在Java语言中,类型的加载、连接和初始化过程都是在程序运行期间完成的。 B. 运行时数据区 1)方法区。 2)堆。 3)虚拟机栈。 4)本地方法栈。 5)程序计数器。 C. 执行引擎 输入的是字节码文件,处理过程是字节码解析的过程,输出的是执行结果。 二、JVM生命周期: JVM实例对应了一个独立运行的Java程序,它是进程级别。 JVM执行引擎实例则对应了属于用户运行程序的线程,它是线程级别。 A. 启动: 启动一个Java程序时,一个JVM实例就产生了,任何一个拥有 public static void main(String[] args) 函数的class都可以作为JVM实例的运行起点。 B. 运行: main() 作为该程序初始线程的起点,任何其它线程均由该线程启动,JVM内部有两种线程(守护线程 和 非守护线程),main()属于非守护线程,守护线程通常由JVM自己使用,Java程序也可以标明自己创建的线程是守护线程。 C. 消亡: 当程序中的所有非守护线程终止时,JVM才退出,若安全管理器允许,程序也可以使用Runtime类或者System

Mediator Pattern中介者模式

天大地大妈咪最大 提交于 2020-08-07 10:10:39
中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。 介绍 意图: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 主要解决: 对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。 何时使用: 多个类相互耦合,形成了网状结构 。 如何解决: 将上述网状结构分离为星型结构 。 关键代码: 对象 Colleague 之间的通信封装到一个类中单独处理。 应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。 优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。 缺点: 中介者会庞大,变得复杂难以维护。 使用场景: 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为

Laravel数据库操作之DB facade

自古美人都是妖i 提交于 2020-08-06 08:34:39
一、查询操作 $student=DB::select("select * from user"); // 返回一个二维数组 $student var_dump($student); // 以节点树的形式输出结果 dd($student); 构造器 // get()返回多条数据 $student=DB::table("user ")->get(); var_dump($student); // first()返回1条数据 $student=DB::table("user ")->first(); //结果集第一条记录 $student=DB::table("user ")->orderBy('ID','desc')->first();//按ID倒序排序 var_dump($student); // where()条件查询 $student=DB::table("user ")->where('ID','>=',2)->get(); //一个条件 $student=DB::table("user ")->whereRaw('ID> ? and age>= ?',[2,10])->get(); //多个条件 dd($student); // pluck()指定字段,后面不加get $student=DB::table("user ")->pluck('name'); dd(

设计模式

﹥>﹥吖頭↗ 提交于 2020-07-28 20:48:25
设计模式 1. 根据目的来分 根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。 结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。GoF 中提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种行为型模式。 2. 根据作用范围来分 根据模式是主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式两种。 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。GoF中的工厂方法、(类)适配器、模板方法、解释器属于该模式。 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。GoF 中除了以上 4 种,其他的都是对象模式。 3.设计模式的功能 1、FACTORY 工厂方法:追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西

spring boot 学习(六)spring boot 各版本中使用 log4j2 记录日志

房东的猫 提交于 2020-07-28 19:58:32
spring boot 各版本中使用 log4j2 记录日志 前言 Spring Boot中默认日志工具是 logback ,只不过我不太喜欢 logback 。为了更好支持 spring boot 框架,我使用 log4j 。 spring boot 各版本与 log4j 的支持情况 1. spring boot 1.2.X 版本 spring boot 1.2.X 版本一般建议使用默认日志工具(logback),也可以使用 log4j。 但,注意的是: Spring Boot 1.2.4.RELEASE 包含一个bug, github上关于该问题的解释 。所以,当你通过 application.properties 定义日志级别时,该错误会更改父记录器级别,在最差情况下会更改根记录器级别。虽然这个bug是修复在 1.2.6.RELEASE ,我建议至少使用 1.2.8.RELEASE (如果你想坚持1.2.x)。 因为 spring boot 现在仍然在快速发展阶段,版本更新较快,有时候就会因为版本问题而出现各种奇奇怪怪的bug。 2. spring boot 1.3.X 版本 spring boot 从 1.3.X 版本开始支持 slf4j + log4j/log4j2 。 * 首先,先解决为什么使用 SL4J Facade? 对于这个问题,网上已经有许多精彩地点答案了

每天学习一个设计模式(五):结构型之门面模式

柔情痞子 提交于 2020-07-28 07:29:37
一、基本概念 门面模式(外观模式)是对象的结构模式,外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。 二、通俗解释 FACADE门面模式:我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。 门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。 医院的例子 现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统。如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情。 首先病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴费,才可以到化验部门做化验。化验后再回到门诊室。 上图描述的是病人在医院里的体验,图中的方框代表医院。

socket长连接和短链接区别

a 夏天 提交于 2020-05-09 07:05:35
短连接 连接->传输数据->关闭连接 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束后就中断连接。短连接是指SOCKET连接后发送后接收完数据后马上断开连接。 长连接 连接->传输数据->保持连接->传输数据->....->关闭连接 长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。 http的长连接 HTTP也可以建立长连接的,使用Connection:keep-alive,HTTP1.1默认进行持久连接。HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持,但还是无状态的,或者说是不可以信任的。 那什么场景下使用长连接或者短连接? 长连接多用于操作频繁,点对点的通讯(及时通讯),而且连接数不能太多。每个TCP连接都需要三次握手,建立连接,会比较耗时。如果每个操作都要先连接,再操作的话,处理速度会降低很多。长连接的特点是每个操作完后都不断开连接,直接发送数据包就可以了,不需要每次都建立连接。 使用场景如下: 1.数据库的连接用长连接。如果用短连接频繁的通信会造成socket错误,而且频繁的socket创建也是对资源的浪费。 2.像web网站的http服务一般都是用短连接,因为长连接对于服务器来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一点资源,如果用长连接

GoF的23种设计模式之结构型模式的特点和分类

醉酒当歌 提交于 2020-05-08 00:49:25
结构型模式描述如何将类或对象按某种布局组成更大的结构。 它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足 “合成复用原则” ,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: 代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。 适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。 桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现的,从而降低了抽象和实现这两个可变维度的耦合度。 装饰(Decorator)模式:动态地给对象增加一些职责,即增加其额外的功能。 外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。 享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用。 组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。 以上 7 种结构型模式,除了 适配器模式 分为 类结构型模式 和 对象结构型模式 两种,其他的全部属于对象结构型模式