![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java23种设计模式学习笔记
文章平均质量分 86
Java23种设计模式学习笔记
Python魔法师
一名老码农,为你分享Python魔法,Python爬虫,Python兼职接单,大数据,Java,副业搞钱的心得。公众号【Python魔法师】
展开
-
Java23种设计模式学习笔记【目录总贴】
创建型模式:关注对象的创建过程 1、单例模式:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点主要:饿汉式(线程安全,调用效率高,但是不能延时加载)懒汉式(线程安全,调用效率不高,但是可以延时加载)其他:双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)静态内部类式(线程安全,调用效率高。但是可以延时加载)枚举单例(线程安全,调用效率原创 2017-03-26 18:41:58 · 470 阅读 · 0 评论 -
解释器模式(Interpreter)
一、解释器模式介绍解释器模式:给定一个语言,定义它的文法一种表示。并定义一个解释器,这个解释器使用该表示来解释语言中的句子。也就是说,如果你想自己开发一种语言来解释执行某些语言的特定语法,可以考虑使用解释器模式。该模式对于我们开发人员来说,基本上都用不到。除非你想自己开发一种语言。解释器模式真正开发起来很难,就相当于自己开发了一种语言给别人用。解释器模式UML图:原创 2017-03-26 18:41:27 · 259 阅读 · 0 评论 -
命令模式(Command)
一、命令模式介绍命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志。以及支持可撤销的操作。说白了,就是将一系列的请求命令封装起来,不直接调用真正执行者的方法,这样比较好扩展。命令模式UML图:Command(抽象命令类):抽象出命令对象,可以根据不同的命令类型。写出不同的实现类ConcreteCommand(具体命令类):实原创 2017-03-26 18:41:29 · 218 阅读 · 0 评论 -
中介者模式(Mediator)
一、中介者模式介绍中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用。从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式核心:1.就是将网状结构处理成星型结构 2.将多对多处理成一对多例如:世界上各个国家的和平和安全,沟通和交流等等问题,如果各个国家都可以互相交互的话,容易造成混乱,关系复杂。这个时候联合国的作用就出现了,原创 2017-03-26 18:41:32 · 301 阅读 · 0 评论 -
职责链模式(Chain of Responsibility)
一、责任链模式介绍责任链模式:将能够处理同一类请求的对象连成一条链,使这些对象都有机会处理请求,所提交的请求沿着链传递。从而避免请求的发送者和接受者之间的耦合关系。链上的对象逐个判断是否有能力处理该请求,如果能则就处理,如果不能,则传给链上的下一个对象。直到有一个对象处理它为止。场景:1、打牌时,轮流出牌2、接力赛跑3、请假审批4、公文审批责任链UML图:原创 2017-03-26 18:41:37 · 249 阅读 · 0 评论 -
迭代器模式(Iterator)
一、迭代器模式介绍迭代器模式:提供一种方法顺序的访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。一般情况,我们自己开发时很少自定义迭代器,因为java本身已经把迭代器做到内部中了(比如:常用的list和set中都内置了迭代器)。当然,如果真有这种需求需要我们自定义迭代器的话,可以参考jdk的迭代器实现方式来实现自己的迭代器。迭代器是可以从前往后,或者从后往前遍历的。为遍原创 2017-03-26 18:41:35 · 294 阅读 · 0 评论 -
观察者模式(Observer)
一、观察者模式介绍观察者模式(发布-订阅模式):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象。使它们能够自动更新自己。例如:1、游戏中的例子:游戏中,当进入新人的时候,大喇叭会通知所有的玩家。所有的游戏玩家是订阅者,而大喇叭就是一个发布者。2、QQ群聊天中:在群里聊天的时候,你发一句话,大家都可以看到。那么,原创 2017-03-26 18:41:14 · 265 阅读 · 0 评论 -
备忘录模式(Memento)
一、备忘录模式介绍备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。例如:1.office重新打开时的恢复功能。2.事务的回滚操作备忘录模式UML图:Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Origina原创 2017-03-26 18:41:11 · 202 阅读 · 0 评论 -
状态模式(State)
一、状态模式介绍状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。当遇到不同的状态遇到不同的行为的时候,可以使用状态模式状态模式UML图State(抽象状态类):定义一个接口以封装与Conte原创 2017-03-26 18:41:16 · 277 阅读 · 0 评论 -
策略模式(Strategy)
一、策略模式介绍策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。例如:商场中的收银软件,内部是怎么针对不同的商品打不同的折扣呢?又或者,是怎么根据不同会员等级打不同的折扣呢?其实内部就是定义了一个算法家族,给每个会员或者商品都指定一个特定的算法,根据不同的算法,打不同的折扣。策略模式UML图:Strategy原创 2017-03-26 18:41:21 · 289 阅读 · 0 评论 -
模板方法模式(Template Method)
一、模板方法模式介绍模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。核心:处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,我们采用工厂方法模式,将这个节点的代码实现转移给子类完成。即:处理步骤在父类中定义好,具体的实现延迟到子类中定义。说白了,就是将一些相同操作的代原创 2017-03-26 18:41:19 · 335 阅读 · 0 评论 -
访问者模式(Visitor)
一、访问者模式介绍访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。也就是说:针对不同对象做一些不同的操作,则可以使用访问者模式。一般也很少用到!!二、应用场景XML文档解析器设计编译器设计复杂集合对象的处理Java23种设计模式学习笔记【目录总贴】参考资料:原创 2017-03-26 18:41:24 · 236 阅读 · 0 评论 -
单例模式(Singleton)
一、单例模式介绍单例模式:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。单例模式优点:1.只生成一个实例,系统开销比较小2.单例模式可以在系统设置全局的访问点,优化共享资源的访问。常见单例模式分类:主要:饿汉式(线程安全,调用效率高,但是不能延时加载)懒汉式(线程安全,调用效率不高,但是可以延时加载)其他:双重检测锁式(由于JVM底层内部模型原原创 2017-03-26 18:41:00 · 184 阅读 · 0 评论 -
工厂模式(Factory)
一、工厂模式介绍:工厂模式实现了创建者和调用者的分离工厂模式分类:1.简单工厂模式2.工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类3.抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。面向对象设计的基本原则:OCP(开闭原则,Open-Closed Principle):原创 2017-03-26 18:41:06 · 300 阅读 · 0 评论 -
建造者模式(Builder和Director)
一、建造者模式介绍建造者模式:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 [构建与表示分离,同构建不同表示]假如一个对象的构建很复杂,需要很多步骤。则可以使用建造者模式,将其构建对象和组装成一个对象这两步给分开来。构建部分为(builder)和组织部分(director),实现了构建和装配的解耦。不同的构建器,相同的装配也可以做出不同的对象。相同的构建器原创 2017-03-26 18:41:03 · 592 阅读 · 0 评论 -
原型模式(Prototype)
一、原型模式介绍原型模式:原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。所谓原型模式,就是java中的克隆技术,以某个对象为原型。复制出新的对象。显然新的对象具备原型对象的特点。效率高(避免了重新执行构造过程步骤)克隆类似于new,但和new不同。new创建新的对象属性采用的是默认值。克隆出来的对象的属性值完全和原型对象相同。并且克隆出的新对象不会影原创 2017-03-26 18:41:08 · 299 阅读 · 0 评论 -
装饰器模式(Decorator)
一、装饰模式介绍装饰模式(decorator):表示动态的给一个对象添加一些新的功能(利用子类继承父类也可以实现),但是比生成子类方式更灵活。也叫装饰者模式或者装饰器模式例如:我们每个人身上穿的衣服,鞋子,领带,披风都可以理解为是对人的装饰。装饰器模式类图:Component:定义一个对象接口,可以给这些对象动态添加职责。真实对象和装饰者对象有相同的接口,这样客户端不用知道原创 2017-03-26 18:41:45 · 276 阅读 · 0 评论 -
桥接模式(Bridge)
一、桥接模式介绍:桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立的变化。而不会直接影响到其他部分。未使用桥接模式的抽象与实现结构图(如下):如果要增加一个apple品牌的电脑,则需要在台式机下新增一个apple的台式机在笔记本下新增一个apple笔记本,在pad下新增一个apple的pad。代码比较繁琐。如果使用桥接模式(如下图),使抽象部分和抽象的派生(实现)部原创 2017-03-26 18:41:50 · 567 阅读 · 0 评论 -
组合模式(Composite)
一、组合模式介绍组合模式:将对象组合成树形结构以表示:部分--整体 的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。java中的组合是指:在A类里定义一个B类的引用,A拥有了B,叫组合。只是单纯的组合而已,而不是一种设计模式。组合和组合模式不是一回事!基本上见到的树形结构都使用到了组合模式。组合模式结构图:组合模式中有几个核心的部分:Leaf(叶子原创 2017-03-26 18:41:48 · 319 阅读 · 0 评论 -
代理模式(Proxy)
一、代理模式介绍代理模式:为其他对象提供一种代理以便控制对这个对象的访问。可以详细控制访问某个类(对象)的方法,在调用这个方法前作的前置处理(统一的流程代码放到代理中处理)。调用这个方法后做后置处理。例如:明星的经纪人,租房的中介等等都是代理代理模式分类:1.静态代理(静态定义代理类,我们自己静态定义的代理类。比如我们自己定义一个明星的经纪人类)2.动态代理(通过程序动原创 2017-03-26 18:41:53 · 406 阅读 · 0 评论 -
适配器模式(Adpater)
一、适配器模式介绍适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。例如:NBA中的球员来自不同国家,而世界标准语言是英语。那他们不会英语,也不能各自学习所有国家的语言。所以,最好的办法就是请不同的翻译将这些球员国家的语言翻译成英语。而这些翻译就是适配器适配器模式分类:1、类适配器模式(不推荐原创 2017-03-26 18:41:55 · 404 阅读 · 0 评论 -
外观模式(Facade)
一、外观模式介绍面向对象的一个比较重要的法则:迪米特法则(最少知识原则):一个软件实体应当尽可能少的与其他实体发生相互作用。外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口。这个接口使得这一子系统更加容易使用。说白了,就可以理解为封装外观模式的核心:为子系统提供统一的入口,封装子系统的复杂性,便于客户端调用例1:股民炒股未使用外观模式情况要让股原创 2017-03-26 18:41:42 · 229 阅读 · 0 评论 -
享元模式(FlyWeight)
一、享元模式介绍享元模式(FlyWeight):运用共享技术有效的支持大量细粒度对象的重用。应用场景:如果项目中有很多完全相同或相似的对象,则可以使用享元模式,节省内存。享元对象能做到共享的关键就是区分了内部状态和外部状态。内部状态:可以共享,不会随环境变化而变化外部状态:不可以共享,会随环境变化而变化享元模式UML图FlyweightFactory(享元工厂类):原创 2017-03-26 18:41:40 · 319 阅读 · 0 评论