Java涉及的设计模式概述

软件设计原则

开闭原则(Open Closed Principle,OCP) :对扩展开放,对修改关闭
单⼀职责原则(Single Responsibility Principle, SRP) :⼀个类只负责⼀个功能领域中的相应职责
⾥⽒替换原则(Liskov Substitution Principle,LSP) :所有引⽤基类的地⽅必须能透明地使⽤其⼦类的对象
依赖倒置原则(Dependency Inversion Principle,DIP) :依赖于抽象,不能依赖于具体实现
接⼝隔离原则(Interface Segregation Principle,ISP) :类之间的依赖关系应该建⽴在最⼩的接⼝上
合成/聚合复⽤原则(Composite/Aggregate Reuse Principle, C/ARP):尽量使⽤合成/聚合,⽽不是通过继承达到复⽤的⽬的
最少知识原则(Least Knowledge Principle,LKP)或者迪⽶特法则(Law of Demeter,LOD):⼀个软件实体应当尽可能少的与其他实体发⽣相互作⽤

分类

请添加图片描述

面向对象设计模式5大基本原则

单一职责原则: 一个类的功能要单一,低耦合
开放封闭原则: 软件实体(类,方法等等)应该可以扩展,但是不能修改  建立抽象类
依赖倒转原则: 抽象不应该依赖细节,细节应该依赖于抽象。 要针对接口编程,而不要针对实现编程
接口隔离原则: 使用多个专门的接口比使用单一的总接口要好 一个类对另外一个类的依赖性应当是建立在最小的接口上
里氏替换原则: 子类型必须能够替换掉它们的父类型 因为子类型继承了父类,所以子类可以以父类的身份出现

工厂模式

简单工厂模式:由⼀个⼯⼚对象来创建实例,客户端不需要关注创建逻 辑,只需提供传⼊⼯⼚的参数
工厂方法模式:定义⼀个抽象⼯⼚,其定义了产品的⽣产接⼝,但不负责具体的产 品,将⽣产任务交给不同的派⽣类⼯⼚。这样不⽤通过指定类型来创建对象
抽象工厂模式:通过在 AbstarctFactory 中增加创建产品的接⼝,并在具体⼦ ⼯⼚中实现新加产品的创建,当然前提是⼦⼯⼚⽀持⽣产该产品

单例模式

一个单例类在任何情况下都只存在⼀个实例, 构造⽅法必须是私有的、由⾃⼰创建⼀个静态变量存储实例,对外提供⼀个静态公有⽅法获取实例
优点是内存中只有⼀个实例,减少了开销,尤其是频繁创建和销毁实例的情况下并且可以避免对资源的多重占⽤。
缺点是没有抽象层,难以扩展, 与单⼀职责原则冲突。

饿汉式单例:

优点:线程安全,没有加锁,执⾏效率较⾼ 
缺点:不是懒加载,类加载时就初始化,浪费内存空间

懒汉式单例:

优点:懒加载 
缺点:线程不安全
改进: DCL双重检验锁懒汉式单例

静态内部类单例:懒加载,线程安全,效率较⾼,实现简单

枚举单例:简单,⾼效,线程安全,可以避免通过反射破坏枚举单例

适配器模式

将⼀个类的接⼝,转换成客 户期望的另⼀个接⼝。它可以让原本两个不兼容的接⼝能够⽆缝完成对接

优点:

1. 提⾼了类的复⽤; 
2. 组合若⼲关联对象形成对外提供统⼀服务的接⼝; 
3. 扩展性、灵活性好。

缺点:

1. 过多使⽤适配模式容易造成代码功能和逻辑意义的混淆。 
2. 部分语⾔对继承的限制,可能⾄多只能适配⼀个适配者类,⽽且⽬标类必须是抽象类。

代理模式

JVM 层⾯ :

静态代理在编译时就将接⼝、实现类、代理类这些都变成了⼀个个实际的 class ⽂件。⽽动态代理是在运⾏时动态⽣成类字节码,并加载到 JVM 中的。

观察者模式

观察者模式主要⽤于处理对象间的⼀对多的关系,是⼀种对象⾏为模式。 该模式的实际应⽤场景⽐较容易确认,当⼀个对象状态发⽣变化时,
所有该对象的关注者均能收到状态变化通知,以进⾏相应的处理。

优点:

1.被观察者和观察者之间是抽象耦合的;
2.耦合度较低,两者之间的关联仅仅在于消息的通知; 
3.被观察者⽆需关⼼他的观察者; 
4.⽀持⼴播通信;

缺点:

1.观察者只知道被观察对象发⽣了变化,但不知变化的过程和缘由; 
2.观察者同时也可能是被观察者,消息传递的链路可能会过⻓,完成所有通知花费时间较多; 
3.如果观察者和被观察者之间产⽣循环依赖,或者消息传递链路形成闭环,会导致⽆限循环;

装饰器模式

装饰器模式主要对现有的类对象进⾏包裹和封装,以期望在不改变类对象 及其类定义的情况下,为对象添加额外功能

应用场景:

装饰能将业务逻辑组织为层次结构, 你可为各层创建⼀个装饰, 在运行时将各种不同逻辑组合成对象。 
由于这些对象都遵循通⽤接⼝, 客户端代码 能以相同的⽅式使⽤这些对象。
如果⽤继承来扩展对象⾏为的⽅案难以实现或者根本不可⾏, 你可以使⽤该模式。
许多编程语⾔使⽤ final 最终关键字来限制对某个类的进⼀步扩展。 复⽤最终类已有⾏为的唯⼀⽅法是使⽤装饰模式: ⽤封装器对其进⾏封装。

责任链模式

⼀个请求沿着⼀条“链”传递,直到该“链”上的某个处理者处理它为⽌。

switch-case 语句

策略模式

针对⼀组算法,将每⼀个算法封装到具有共同接⼝的独⽴的类中,从⽽使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发⽣变化。 其主要⽬的是通过定义相似的算法,替换 if else 语句写法,并且可以随时相互替换。

eg:

Java.util.List 就是定义了⼀个增( add )、删( remove )、改 ( set )、查( indexOf )策略,
⾄于实现这个策略的 ArrayList 、 LinkedList 等类,只是在具体实现时采⽤了不同的算法。
但因为它们策略⼀样,不考虑速度的情况下,使⽤时完全可以互相替换使⽤。

JDK中用了哪些设计模式

桥接模式: 这个模式将抽象和抽象操作的实现进⾏了解耦,这样使得抽象和实现可以独⽴地变化
    应⽤程序使⽤ JDBC 驱动程序进⾏开发的⽅式
适配器模式: ⽤来把⼀个接⼝转化成另⼀个接⼝。使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类可以在⼀起⼯作
    java.util.Arrays#asList()
组合模式: ⼜叫做部分-整体模式,使得客户端看来单个对象和对象的组合是同等的。换句话说,某个类型的⽅法同时也接受⾃身类型作为参数。
    java.util.Set / List #addAll(Collection
装饰者模式: 动态的给⼀个对象附加额外的功能,这也是⼦类的⼀种替代⽅式。可以看到,在创建⼀个类型的时候,同时也传⼊同⼀类型的对象。
    java.util.Collections#checkedList|Map|Set|SortedSet|Sort edMap
享元模式: 使⽤缓存来加速⼤量⼩对象的访问时间。
    包装类
代理模式: 代理模式是⽤⼀个简单的对象来代替⼀个复杂的或者创建耗时的对象。
    反射,AOP
抽象⼯⼚模式: 提供了⼀个协议来⽣成⼀系列的相关或者独⽴的对象,⽽不⽤指定具体对象的类型。它使得应⽤程序能够和使⽤的框架的具体实现进⾏解耦
    这在 JDK 或者许多框架⽐如 Spring 中都随处可⻅。它们也很容易识别,⼀个创建新对象的⽅法,返回的却是接⼝或者抽象类的,就是抽象⼯⼚模式
    java.util.Arrays#asList()
建造者模式: 定义了⼀个新的类来构建另⼀个类的实例,以简化复杂对象的创建。建造模式通常也使⽤⽅法链接来实现
    StringBuilder
观察者模式: 它使得⼀个对象可以灵活的将消息发送给感兴趣的对象
    java.util.EventListener
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值