【设计模式】Java设计模式(记忆点)

这里是初读程杰老师的《大话设计模式》得到的一些对应模式应用场景的简单总结,后期深读时会继续更新设计模式系列的博文哒✪ω✪

IMG_7799.jpg

策略模式

策略模式用来封装算法,当遇到不同时间使用不同时可以使用策略模式

虽然当业务变更时仍需要改变Text里的switch语句中的判断条件,但是任何需求的变更都是需要成本的
—

装饰模式

装饰模式就是为已有功能动态添加更多功能的一种方式,当代码需要新功能时不必向主类中添加代码从而增加主类的复杂度,可以使用修饰类来完成这个功能


代理模式

代理模式的应用场景:1.远程代理,即为一个对象在不同的地址空间提供局部代表,从而可以隐藏对象在不同地址空间的事实;2.虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象如HTML网页中的大量图片信息;3.安全代理,用来控制真实对象的访问权限;4.智能指引,指在调用真实的对象时代理处理另外一些事


工厂模式

工厂方法定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使一个类实例化延迟到了子类。相比于简单工厂的添加功能需要修改工厂的switch语句,这违背了开-闭原则,所以引入了工厂模式,它将修改的代码从普通类移动到了客户端


原型模式

原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。一般在初始化信息不变的的情况下,克隆是最好的方法,既隐藏了初始化的细节,又是对性能的极大提高


模版模式

模版模式提供了一个代码复用的平台,通过模版模式将一些单一的行为整合到一个单一的地方,这样使子类摆脱了重复单一行为的纠缠


迪米特法则

迪米特法则指出如果两个类不必彼此直接通信,那么它们就不应该直接发生相互作用,如果其中一个类需要调用另一个类的方法的话,那么可以通过第三方转发这个调用

迪米特法则根本思想其实强调了类之间的松耦合


外观模式

外观模式为子系统的一组接口提供了一致的界面,此模式定义了一个高层接口,这个接口使得这个子系统更加容易使用

外观模式用一个高层接口使得原本设计粗糙且复杂的遗留代码有了一个清晰的接口,这样让新的系统更加容易与其交互


建造者模式

建造者模式将一个复杂对象的构建与表示分离,这样使得同样的构建过程可以创建不同的表示

建造者模式的Builder定义了抽象的建造过程,使得实例化的建造可以不遗漏建造过程(遗漏的话是不能通过编译的),与此同时创建Director类可以用来创建具体的想要创建的对象


观察者模式

观察者模式一般使用在当一个对象改变同时需要改变其他对象时,并且并不知道具体有多少对象需要改变,观察者模式的工作其实就是在接触耦合,使得耦合双方依赖于抽象而非具体,从而使得各自的变化不回影响另一个的变化


抽象工厂模式

抽象工厂模式提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类


三种工厂模式对比

简单工厂模式:生产一个有多种款式的对象,对象通用抽象父类,用Switch决定实例化哪一种款式的对象;
工厂模式:生产一个有多重款式的对象,对象通用抽象父类,每种款式有其特定的生产工厂,它们都继承一个工厂接口,在客户端种决定用哪一个特定工厂来实例化工厂,这将实例化延迟到了客户端;
抽象工厂模式:生产多个有多种款式的对象3应其抽象父类,多个对象用多个特定工厂来连接工厂接口,接口里对应了每个款式对应的对象创建实例


状态模式

状态模式:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据自己的状态来改变自己的行为的时候可以考虑使用状态模式

由于对于状态来判断行为会含有很长的判断语句,这将是long method其实就已经有了坏味道,这违反了单一职责和开-闭原则,状态模式说白了就是将很长的判断语句分离开来,以便后期修改与维护


适配器模式

适配器模式:适配器类继承适配目标的父类,被适配作为适配器的内部对象变量,在构造函数时将其实例化,然后将目标父类的函数内部调用被适配的对象的相对应的内方法


备忘录模式

备忘录模式:在需要进行存储备忘录的类里添加保存备忘录的方法,并将需要保存的属性加入,由于对备忘录的封装属性最好再加备忘录管理者类,通过管理者类来对备忘录进行存储和使用


组合模式

组合模式:将对象组合成树形结构,以表示它们之间的额“整体-部分”的层次结构,组合模式使得客户对单个对象和组合对象的使用具有一致性

当发现需求中是整体与部分的结构层次时,并且客户可以忽略组合对象与单个对象之间的关系,从而统一的使用组合结构中的所有对象时就可以考虑使用组合模式了


迭代器模式

迭代器模式:提供了一个方法可以顺序的访问某聚合类型里的各个元素,而又不暴露各个对象的内部表示

很多语言中已经不再显式的使用迭代器模式而是已经把这个模式做到了语言当中例如foreach in循环或者枚举类型,但是迭代器模式还是拥有它本身的优点,比如可以自己定义一种循环方式,而不是简单的进行顺序遍历


单例模式

单例模式:为了确保类被一次且只能被实例化一次,并且提供获取此实例的方法 一般来说不建议使用懒汉方式,一般使用饿汉方式,在明确要用lazy loading时会使用登记模式,如果涉及到反序列化创建对象时可以考虑使用枚举方式,如果有特殊需求可以使用双检锁方式


桥接模式

桥接模式:由于大量的继承会导致更改影响大难以更新维护,违背了开-闭原则,所以也就是当多角度分类时,就可以将这些类分离出来,这种时候使用合成/聚合复用原则,尽量不使用继承

可以这样想:猪八戒投胎,灵魂在河的一边,河对面有两个肉体,红猪和绿猪;灵魂需要过桥,选择红猪的肉体或者绿猪的肉体完成投胎。在上面的例子中,红猪和绿猪就是 HandsetGame 和 HandsetPhone,灵魂是 HandsetBand 类,而那座桥就是 HandsetBand 这个接口。


命令模式

命令模式:把请求一个操作的对象与它怎么执行一个操作的对象分割开来,这样在程序中请求者和实现者分割开来,可以方便的加入一个新的命令,并且降低了系统的耦合度


责任链模式

责任链模式有点类似于迭代器模式,一个对象管理对应的业务,超出范围则转入下一个对象管理,以此类推


中介者模式

中介者模式是将很多实体之间的交互封装在一个特定的类当中,使得类之间松耦合,一般应用于一组定义良好但是复杂的方式进行通信的场合,但是由于中介者模式的特点使得中介者类很复杂难以维护


享元模式

享元模式是在一个程序需要创建大量的对象并且这些对象大多数的状态都可以是外部状态时就可以考虑使用享元模式,享元模式是通过对象生产工厂生产出来具有内部状态的对象,然后提供给不同用户赋予对象外部状态来使用,,这样避免了大量的创建对象而造成的占用大量的空间问题

如果觉得还不错的话,把它分享给朋友们吧(ง •̀_•́)ง