设计模式
五山口老法师
腾讯后台开发工程师
展开
-
开放封闭原则(OCP)
开放封闭原则:软件实体(类,模板,函数等)应该是可以扩展的,但是不可以修改。举个栗子,加入我们要设计一个系统,在项目启动的时候我们不可能一下子把所有的需求全部考虑到。我们所需要做的就是多扩展,少修改!在我们最初编写代码的时候,假设变化不会发生。当变化发生的时候,我们就创建抽象来隔离以后发生的同类变化。OCP原则是面向对象设计的核心所在。遵循这个原则可以带来 面向对象技术的巨大好处,...原创 2018-10-10 09:03:36 · 210 阅读 · 0 评论 -
行为型模式:责任链模式
定义:责任链模式(Chain of Responsibility)使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象能够处理它。类型:行为类模式考虑以下这样的场景:责任链,顾名思义,这个责任(请求)层层传递,直到能被正确的承担(处理)你要去给某公司借款 1 万元,当你来到柜台的时候向柜员发起 "借款 1 ...原创 2019-01-30 22:12:52 · 212 阅读 · 0 评论 -
结构型模式:桥接模式
桥接模式即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。 桥接模式将继承关系转化成关联关系(一个维度持有另一个维度的引用),它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。实现系统可能有多个角度分类,每一种角度都可能变化,那么把这种多角度分类给分离出来让他们独立变化,减少他们之间耦合。 桥接模式中的所谓脱耦,就是指在一个软件系统的抽象...原创 2019-02-02 18:18:29 · 180 阅读 · 0 评论 -
行为型模式:策略模式
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。通俗点,策略模式就是打折模式策略模式的结构 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理(各算法自成一类(具体策略(ConcreteStrategy)角色),实现抽象算法接口...原创 2019-02-02 14:53:55 · 250 阅读 · 0 评论 -
结构型模式:装饰模式
我曾经以为应该用继承处理一切。后来领教到运行时扩展,远比编译时期的继承威力大。本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型的继承滥用问题。在本章将会学到如何使用对象组合的方式,做到在运行时装饰类。一旦你熟悉了装饰的技巧,你将能在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。 如果仅仅使用继承,那么关系将会如下图:由于业务的扩展产生很多的子类...原创 2019-02-02 15:07:07 · 126 阅读 · 0 评论 -
结构型模式:外观模式(门面模式)
外观模式外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。介绍意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更...原创 2019-02-02 16:29:56 · 156 阅读 · 0 评论 -
创建型模式:工厂模式(简单工厂+工厂方法+抽象工厂)
一、引子话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”。你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸...原创 2019-01-26 17:08:52 · 454 阅读 · 0 评论 -
单例模式:基于反射和反序列化破解单例模式的漏洞及其解决方法
单例模式使得在创建类对象的时候只创建一个对象实例。上一节讲解了五种实现单例模式的方式。分别为:饿汉模式、懒汉模式、double check、静态内部类、枚举但是基于反射和反序列化可以破解单例模式的单一实例,在使用反射时可以通过调用setAccesible()直接调用私有构造器,创建新的实例;在反序列化的时候会直接创建新的对象实例。但是以上漏洞只针对前四种方式,枚举由于是基于JVM底层实现机...原创 2019-01-26 11:58:23 · 377 阅读 · 0 评论 -
设计模式:纵观
设计模式的六大原则1、开闭原则(Open Close Principle)开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。2、里氏代换原则(Liskov Substitution Principle...原创 2019-01-26 10:58:42 · 161 阅读 · 0 评论 -
创建型模式:单例模式(懒汉+饿汉+双锁校验+内部类+枚举)
单例模式单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:·1、单例类只能有一个实例。·...原创 2019-01-26 10:55:09 · 362 阅读 · 0 评论 -
组合模式
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。意图:将...原创 2018-11-05 14:42:50 · 156 阅读 · 0 评论 -
原型模式、模板方法、迪米特法则、外观模式
原型模式,即深浅复制问题。模板方法模式,将多个类的相同的重复操作提升到模板类中,将更深层次的不同点用虚函数的多态,封装到不同的子类中。迪米特法则,修电脑的问题。强调类之间的松耦合。外观模式,为子系统中的一组接口提供一个一致的画面,此模式定义了一个高层的接口,这个接口使得这一子系统更加容易利用。...原创 2018-10-27 21:04:24 · 187 阅读 · 0 评论 -
工厂方法模式和简单工厂模式的区别
简单工厂模式就我们的计算器例子来说,简单工厂模式的思想就是,创建一个运算类,创建一个简单工厂类。运算类派生加法类、减法类、乘法类......简单工厂类主要是根据传入的符号字符串,做相应的条件判断来创建相应的运算对象。当我们需要增加运算功能的时候,需要在运算类中派生相应的运算子类,在简单工厂类中增加相应的条件判断。【在简单工厂类中增加相应的条件判断】这一来就违反了设计模式的OCP...原创 2018-10-23 21:43:16 · 313 阅读 · 0 评论 -
结构型模式:代理模式
所谓代理模式,其实就是一个执行实体对于另一个目的实体的动作,转换为某个中间实体对于目的实体的动作,但动作本质还是执行实体发出的。而这个中间实体就是我们的代理。举个例,A让B帮他向C传达自己的爱意。这里B就是A的代理!代理模式的实现是在代理类中添加执行实体的引用,然后代理类和执行实体具有相同的动作接口。执行实体类中含有目的实体的对象,通过代理类的执行实体的接口调用,从而间接地对目的实体进...原创 2018-10-23 21:27:58 · 151 阅读 · 0 评论 -
装饰模式
尽量避免继承过多的子类,组合优于继承。将主体和扩展分离。一个基类的多个子类具有相同的字段,应适当地将其向上提升。消除代码的冗余,减少子类的个数。装饰模式完美的使用了面向对象的多态特性。 ...原创 2018-10-21 20:29:00 · 142 阅读 · 0 评论 -
三大工厂模式的优缺点
简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类。我们掌握一种思想,就是在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封装哪里),以适应客户的变动,项目的扩展。用这三种设计模式都可以实现,那究竟这三种设计模式有什么异同呢?下面根据这三者之间的特点,优点,缺点,适用范围进行比较。一.特点简单工厂模式:专门定义一个...原创 2019-03-08 08:43:08 · 16781 阅读 · 0 评论