设计模式
文章平均质量分 53
请叫我大虾
这个作者很懒,什么都没留下…
展开
-
设计模式:KISS、YAGNI、DRY 原则,迪米特法则(LOD)
如何理解“KISS 原则”?KISS 原则的英文描述有好几个版本,比如下面这几个。Keep It Simple and Stupid. Keep It Short and Simple. Keep It Simple and Straightforward.不过,仔细看你就会发现,它们要表达的意思其实差不多,翻译成中文就是:尽量保持简单。...原创 2021-01-12 16:25:41 · 709 阅读 · 0 评论 -
设计模式:控制反转(Inversion Of Control)
控制反转并不是一种具体的实现技巧,而是一个比较笼统的设计思想,一般用来指导框架层面的设计。依赖注入(DI Dependency Injection)依赖注入跟控制反转恰恰相反,它是一种具体的编码技巧。 有一个非常形象的说法,那就是:依赖注入是一个标价 25 美元,实际上只值 5 美分的概念。也就是说,这个概念听起来很“高大上”,实际上,理解、应用起来非常简单。 那到底什么是依赖注入呢?我们用一句话来概括就是:不通过 new() 的方式在类内部创建依赖类对象,而是将依赖的类对象在...原创 2021-01-12 15:11:13 · 318 阅读 · 0 评论 -
设计模式:设计原则
如何理解单一职责原则(SRP)?SOLID 原则并非单纯的 1 个原则,而是由 5 个设计原则组成的,它们分别是:单一职责原则、开闭原则、里式替换原则、接口隔离原则和依赖反转原则,依次对应 SOLID 中的 S、O、L、I、D 这 5 个英文字母。 单一职责原则的英文是 Single Responsibility Principle,缩写为 SRP。A class or module should have a single responsibility。如果我们把它翻译成中文,那就是:一...原创 2021-01-11 14:57:25 · 197 阅读 · 0 评论 -
类与类之间的交互关系
类与类之间都哪些交互关系呢?UML 统一建模语言中定义了六种类之间的关系。它们分别是:泛化、实现、关联、聚合、组合、依赖。关系比较多,而且有些还比较相近,比如聚合和组合,接下来我就逐一讲解一下。泛化(Generalization)可以简单理解为继承关系。具体到 Java 代码就是下面这样:public class A { ... }public class B extends A { ... }实现(Realization)一般是指接口和实现类之间的关系。具体到 Ja...原创 2021-01-11 13:05:02 · 553 阅读 · 0 评论 -
设计模式:迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern): 属于行为型模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即: 不暴露其内部结构。...原创 2019-12-28 16:17:22 · 253 阅读 · 0 评论 -
设计模式:访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern): 封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 主要将数据结构与数据操作分离,解决数据结构和操作耦合性问题。 访问者模式的基本工作原理: 在被访问的类里面加一个对外提供接待访问者的接口。public abstract class Action { publi...原创 2019-12-28 14:44:33 · 196 阅读 · 0 评论 -
设计模式:命令模式(Command Pattern)
命令模式(Command Pattern): 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的操作是哪个。 我们只需在程序运行时指定具体的请求接受者即可,此时,可以使用命令模式来进行设计。 命令模式在spring框架的JdbcTemplate中有应用。 通俗易懂的理解, 将军发布命令,士兵去执行。其中有几个角色,将军(命令...原创 2019-12-26 16:09:24 · 252 阅读 · 0 评论 -
设计模式:模板方法(Template Method Pattern)
模板方法模式: 在一个抽象类公开定义了执行它的方法的模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 属于行为型模式。 spring ioc容器初始化时运用到模板方法模式。// 抽象类,表示豆浆public abstract class SoyMilk { // 模板方法可以做成final,不让子类覆盖 final void make(){...原创 2019-12-26 09:39:08 · 195 阅读 · 0 评论 -
设计模式:代理模式(Proxy)
1. 代理模式: 为一个对象提供一个替身,以控制对这个对象的访问,即通过代理对象访问目标对象,这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。2. 被代理的对象可以是远程对象,创建开销大的对象或需要安全控制的对象。3. 代理模式有不同的形式,主要有三种: 静态代理,动态代理(JDK代理,或者接口代理)和cglib代理。静态代理 ...原创 2019-12-25 14:43:00 · 221 阅读 · 0 评论 -
设计模式:享元模式(Flyweight Pattern)
1。享元模式:也叫蝇量模式,运行共享技术有效的支持大量细粒度的对象。 2。享元模式常用于系统底层开发,解决系统的性能问题。比如数据库连接池,里面都是创建好的连接对象。 3。享元模式能够解决重复对象的内存浪费问题,当系统中有大量相似对象,需要缓冲池时,不需总是创建新对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率。 4。享元模式经典的应用场景就是池技术。S...原创 2019-12-20 16:49:28 · 277 阅读 · 0 评论 -
设计模式:外观模式(Facade)
外观模式(Facade)也叫过程模式, 外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。 外观类(Facade): 为调用端提供统一的调用接口,外观类知道哪些子系统负责处理请求,从...原创 2019-12-20 10:17:09 · 243 阅读 · 0 评论 -
设计模式:组合模式(Composite Pattern)
组合模式: 又叫部分整体模式, 它创建了对象组的树形结构,将对象组合成树状结构以表示"整体-部分"的层次关系。 JDK中的HashMap就使用了组合模式public abstract class OrganizationComponent { private String name; // 名字 private String desc; // 说明 public...原创 2019-12-19 10:35:11 · 227 阅读 · 0 评论 -
设计模式:装饰者模式(Decorator)
装饰者模式: 动态的将新功能附加到对象上, 在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(OCP).java的IO结构,FileInputStream就是一个装饰者public abstract class Drink { public String desc; // 描述 private float price = 0.0f; public S...原创 2019-12-18 10:10:22 · 187 阅读 · 0 评论 -
设计模式:桥接模式(Bridge)
桥接模式: 将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。public abstract class Phone { private Brand brand; public Phone(Brand brand){ this.brand = brand; } public void open() { this.brand.open(); }...原创 2019-12-17 14:08:36 · 204 阅读 · 0 评论 -
设计模式:策略模式
jdk中的比较器Comparator就使用到了策略模式原创 2019-12-02 22:43:02 · 174 阅读 · 0 评论 -
设计模式:适配器模式
适配器模式主要分为三类: 类适配器模式, 对象适配器模式,接口适配器模式。 SpringMVC中的HandlerAdapter就是用了适配器模式。适配器模式工作原理: 1. 将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容。 2. 从用户角度看不到被适配者,是解耦的。 3. 用户调用适配器转换出来的目标接口方法,适配器再调用被适配者的相关接口方法。...原创 2019-09-21 13:02:53 · 227 阅读 · 0 评论 -
设计模式:建造者模式
建造者模式(builder pattern): 1. 又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。 2. 建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。 类图...原创 2019-09-17 23:32:47 · 208 阅读 · 0 评论 -
设计模式:原型模式
java中的Object类是所有类的根类。Object类提供了一个clone()方法,该方法可以将一个java对象复制一份,但是需要实现clone的java类必须要实现一个接口Cloneable,该接口表示该类能够复制且具有复制的能力。原型模式基本介绍 1). 原型模式是指: 用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象。 2)....原创 2019-09-09 14:07:14 · 198 阅读 · 0 评论 -
设计模式:抽象工厂模式
1). 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类.2). 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合.3). 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象).4). 将工厂抽象成两层,AbsFactory(抽象工厂)和具有实现的工厂子类,程序员可以根据创建对象类型使用对应的工厂子类. 这样...原创 2019-09-08 11:34:11 · 257 阅读 · 0 评论 -
设计模式:工厂方法模式
工厂方法模式 定义一个创建对象的抽象方法,由子类决定要实例化的类,工厂方法模式将对象的实例化推迟到子类。代码UML类图如下:飞机类package com.China.factory.factorymethod.plane;public abstract class Plane { protected String name; public St...原创 2019-09-08 10:07:17 · 235 阅读 · 0 评论 -
设计模式:装饰者模式
装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系。引入装饰类,扩充新功能。 继承也可以增加类的功能。但是使用继承,会使继承体系庞大,代码可能会冗余。package com.Decorator;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;...原创 2019-03-07 09:52:06 · 185 阅读 · 0 评论 -
设计模式一:设计模式遵循的原则
1.开闭原则 面向对象的可复用设计的第一块基石就是"开-闭"原则(open-closed principle) 一个软件实体应当对扩展开放,对修改关闭. 抽象化是实现开闭原则的关键,感觉面向接口编程是很好的遵循了这种原则. 2.里氏代换原则(Liskov Substitution Principle LSP) 任何基类可以出现的地方,子类一定可以出现....原创 2019-04-18 19:46:02 · 347 阅读 · 0 评论 -
设计模式二:接口
java中的接口相当于生活中的插座。 电器(比如,电视,微波炉,洗衣机)都可以插在同一个插座上。这些电器就是可插入构件(pluggable component)。 可插入构建的关键在于存在一个公用的接口,以及每个构件都实现了这个接口。 因此接口是实现构件的可插入性的关键。 接口就像一个角色,它包装与该角色相关的操作和属性,而实现这个接口的类便是扮演这个角色的演员。一个角色可以由不...原创 2019-04-19 09:53:47 · 244 阅读 · 0 评论 -
设计模式三:抽象类
在java语言里, 类分为两种:一种是抽象类,一种是具体类。具体类可以实例化,抽象类不可以实例化。 一个抽象类仅提供一个类型的部分实现。 一个抽象类不能被实例化,那么一个抽象类被设计出来,一定是被用来继承的。 那么同时,具体类不是用来继承的。...原创 2019-04-19 10:56:44 · 415 阅读 · 0 评论 -
设计模式五:外观模式
外观模式: 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。Facade:定义子系统的多个模块对外的高层接口,通常需要调用内部多个模块,从而把客户的请求代理给适当的子系统对象。模块:接受Facade对象的委派,真正实现功能,各个模块之间可能有交互。 注意,Facade对象知道各个模块,但是各个模块...原创 2019-05-19 12:10:00 · 212 阅读 · 0 评论 -
设计模式六:适配器模式
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式的功能: 适配器模式的主要功能是进行转换匹配,目的是复用已有的功能,而不是来实现新的接口。 适配器里面也可以实现功能,称这种适配器为智能适配器。适配器的实现方式其实是依靠对象组合的方式。 适配器的常...原创 2019-05-19 22:12:55 · 200 阅读 · 0 评论 -
设计模式七:单例模式
单例模式: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)单例模式的八种方式 1).饿汉式(静态常量) 2).饿汉式(静态代码块) 3).懒汉式(线程不安全) 4).懒汉式(线程安全,同步方法) ...原创 2019-05-26 13:19:40 · 222 阅读 · 0 评论 -
设计模式四:简单工厂
提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口,抽象类,也可以是具体的类。 面向接口编程静态工厂: 通常把简单工厂类实现成一个工具类,直接使用静态方法就可以了。也就是说简单工厂的方法通常都是静态的。所以也被称为静态工厂。 简单工厂的本质是选择实现。 那么什么时候选用简单工厂? 1. 如果想要完全封装隔离...原创 2019-05-17 23:14:32 · 273 阅读 · 0 评论 -
设计模式:设计模式七大原则
单一职责原则 对类来说,即一个类应该只负责一项职责。如A类负责两个不同的职责:职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误。所以需要将类A的粒度分解为A1,A2。 ①降低类的复杂度,一个类只负责一项职责。 ②提高类的可读性,可维护性。 ③降低变更引起的风险。 ④通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级...原创 2019-07-17 11:03:14 · 326 阅读 · 0 评论 -
设计模式:设计模式七大原则之迪米特法则
迪米特法则的核心是降低类之间的耦合 , 最少知道原则import java.util.ArrayList;import java.util.List;public class Demeter1 { public static void main(String[] args){ SchoolManager schoolManager = new SchoolManager(); ...原创 2019-09-04 16:59:08 · 266 阅读 · 0 评论 -
设计模式:单例模式之饿汉式
1).饿汉式(静态常量) 步骤如下: ①构造器私有化 ②类的内部创建对象 ③向外部暴露一个静态的公共方法 优点: 这种写法比较简单,就是在类加载的时候就完成实例化,避免了线程同步问题。public class SingletonTest01 { public static void main(String[] args...原创 2019-09-05 17:15:53 · 238 阅读 · 0 评论 -
设计模式:单例模式之懒汉式
懒汉式(线程不安全)1). 起到了懒加载的效果,但是只能在单线程下使用。2). 如果在多线程下,一个线程进入了if(null == instance)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例,所以在多线程环境下不可使用这种方式。3). 结论,在实际开发中,不要使用如下这种方式。public class SingletonTest03 ...原创 2019-09-06 16:05:03 · 254 阅读 · 0 评论 -
设计模式:单例模式之双重检查
双重检查double-check概念是多线程开发中常使用的,如下代码所示,我们进行了两次if(null==instance)检查,这样就可以保证线程安全了。 实例化代码只用执行一次,后面再次访问时,判断if(null==instance),直接return实例化对象,也避免了反复进行方法同步。public class SingletonTest06 { public...原创 2019-09-06 17:13:28 · 271 阅读 · 0 评论 -
设计模式:单例模式之静态内部类
优缺点说明: 1). 这种方式采用了类加载的机制来保证初始化实例时只有一个线程。 2). 静态内部类方式在Singleton1类被加载时并不会立即实例化,而是在需要实例化时,调用getSingleton1()方法,才会装载SingletonInstance类,从而完成Singleton1的实例化。 3). 类的静态属性只会在第一次加载类的时候初始化,所以在这里,jvm帮助我们...原创 2019-09-06 18:00:54 · 302 阅读 · 0 评论 -
设计模式:单例模式之枚举
优缺点: 1). 借助JDK1.5中添加的枚举来实现单例模式,不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。 2). 这种方式是Effective Java作者Josh Bloch提倡的方式。 3). 结论: 推荐使用package com.China.singleton.example8;public class SingletonTest08 ...原创 2019-09-06 22:34:20 · 314 阅读 · 0 评论 -
设计模式:单例模式在JDK中的应用
在java jdk中, java.lang.Runtime就是经典的单例模式。 以下截取Runtime部分代码package java.lang;import java.io.*;import java.util.StringTokenizer;/** * Every Java application has a single instance of class * &...原创 2019-09-06 22:48:13 · 365 阅读 · 0 评论 -
设计模式:简单工厂模式
飞机抽象类package com.China.factory.simplefactory.plane;public abstract class Plane { protected String name; public String getName() { return name; } public void setName(String name) { this...原创 2019-09-07 15:34:17 · 209 阅读 · 0 评论 -
设计模式
将将来有可能变化的代码和基本不变的代码分开. 这样就尽可能的减少"代码改变"带来的影响,提高了系统的灵活性。这样将来可能变化的代码改变了,将不会影响不变的代码。 所有的设计模式基本都是让可能变化的代码独立出来。 在软件开发中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案。 设计模式的分类: 1. 创建型模式: ...原创 2019-03-01 17:04:38 · 206 阅读 · 0 评论