当前位置: 首页 > 科技观察

我们可以从JDK中学到哪些设计模式?

时间:2023-03-16 22:54:48 科技观察

结构模式:Adapter模式:常用于新接口适配旧接口:在我们的业务代码中,经常有新旧接口适配需求,可以采用这种模式。桥接模式:将抽象与抽象的具体实现解耦,使抽象与抽象的具体实现可以独立变化。胖超小声说:我们其实每天都在用这个模式,只是你可能不知道。只要你使用面向接口编程,其实就是在使用桥接模式。Composite模式使客户端看起来是在平等地处理单个对象和对象的组合,换句话说,某种类型的方法也接受自己的类型作为参数。(所以换句话说就是一个类型接受相同类型的方法)胖超小声说:从上面的英文句子可以知道组合模式经常被用来优化递归操作。比如每个公司都有老板系统,都会有什么菜单功能。比如一级菜单下有二级菜单,二级菜单下有三级菜单。删除一级菜单时,需要不断删除子菜单,可以试试这种设计模式。简而言之,您可以对任何级联操作尝试这种设计模式。装饰器模式动态地将附加功能附加到对象,因此它也是子类化的替代方法。这种设计模式在JDK中被广泛使用。以下只是几个示例:这种模式的使用过于广泛。我们常用的AOP既有动态代理的,也有装饰器的。Facade模式为一组组件、接口、抽象或子系统提供了一个简化的接口。费超小声说:我们日常使用的SLFJ原木,都是门面原木。比如我们在使用Dubbo的时候,对外服务尽量使用门面模式,然后服务调用各种服务进行聚合。享元模式使用缓存来减少小对象的访问时间:只要使用缓存,基本上都是享元模式。很多同学说他们的项目太low了,没有用到任何设计模式。这不是开玩笑吗?你用一个map缓存几个对象,基本上是用了flyweight的思想。代理模式代理模式用于用简单的对象代替创建复杂或耗时的对象。费超小声说:代理模型应用广泛,大家知道的开源框架基本上都用的是动态代理。创建模式抽象工厂模式抽象工厂模式提供了一种协议来生成一系列相关或独立的对象,而无需指定特定对象的类型。它使应用程序能够与所用框架的具体实现分离。在JDK和许多开源框架(如Spring)中随处可用,它们很容易被发现。任何创建对象但返回接口或抽象类的东西都是抽象工厂模式。(任何用来创建对象但仍然返回接口或抽象类的方法)胖超小生:从英文可以总结出这种模式可以和策略模式结合使用。构建器模式用于通过定义一个类来简化复杂对象的创建,该类的目的是构造另一个类的实例。构建器模式还允许实现Fluent接口。费超低声道:我们业务代码中用到的这个场景实在是太广泛了。比如订单系统大部分项目都有。order对象是一个复杂的对象,所以我们可以使用builder模式来做。工厂方法只是一种返回实际类型的方法。胖超小声说:这是大家都知道的设计模式,就不多介绍了。原型模式使类的实例能够复制自身。如果创建对象的实例复杂且耗时,则可以使用此模式,而不是创建新实例,您可以复制一个对象并直接修改它。费超低声道:这是一个你以为冷门的设计模式,但你错了,这是一个非常流行的设计模式。比如我们的业务代码,往往需要进行各种DTO、BO、DO、VO的转换。其实我们可以参考一下原型设计模式的思想。单例模式用于确保一个类只有一个实例。JoshuaBloch在EffectiveJava中建议的另一种方法是使用枚举。胖超小声说:在平时的开发中,单例是我们用的最多的,因为Springbean默认是单例级别的。单例属于大家基本都知道的设计模式。责任行为模式链通过将请求从一个对象传递到链中的下一个对象来解耦对象,直到请求被处理。链中的对象是同一接口或抽象类的不同实现。胖超小声嘀咕:这个设计模式基本上是用在所有有Filter关键字的地方。业务代码中用到的场景太多了,用到拦截器的地方基本都用到了这种设计模式。命令模式将命令包装在对象中,以便它们可以像任何其他对象一样存储、传递到方法中并返回。费超低声道:命令模式用的比较频繁,和策略模式差不多。你可以搜索具体的区别。如果你用过Activiti工作流引擎,可以看看里面的源码。命令模式用在很多地方。解释器模式该模式通常描述为语言定义的句法,用于解释该格式的语句。(这个模式一般描述的是为那种语言定义一个文法,然后用那个文法来解释那种格式的语句。)费超低声说:这个比较冷门,费超没用过。如果你用过,可以留言告诉费超。迭代器模式提供了一种访问集合中对象的统一方式。胖超小声说:中间件和基础框架组的同学可能用的比较多,业务代码用的不多,但是JDK里面这种用法很经典,大家可以看看。Mediator模式使用中间对象进行消息分发并减少类之间的直接依赖。胖超低声道:看到这个描述,我就不用多说了。业务代码用到的场景太多了。比如你用MQ,其实就是在用中介模型。所以飞超一再强调,即使每天都是CRUD,关注飞超,一起学习,也可以为你的CRUD项目增加美颜+滤镜(设计模式)增强效果。Memento模式拍摄对象状态的快照,以便可以在不暴露其内容的情况下将对象恢复到其原始状态。例如,Date对象通过自身内部的long值实现备忘录模式。费超低声道:这个在商业上用的不多。按照费超的理解,其中一种场景是,你想把数据丢给MQ,但是MQ暂时不可用,所以你就把数据暂时存到DB中,以后再把数据存到DB中。轮询抛给MQ。如果你有更好的场景,留言告诉费超。空对象模式,它允许您抽象空对象的处理。胖超小声嘀咕:这个业务代码用的不多,但是JDK里面的这些方法还是比较常用的。观察者模式用于为组件提供一种灵活的方式来向感兴趣的接收者广播消息。费超小声说:我们的业务代码一般都是以Zookeeper作为观察者。基本上用到ZK的地方,都是用观察者模式,比如分布式锁,比如服务发现等等,State模式可以让你很方便的根据内部状态改变对象在运行时的行为。费超低声道:这在业务代码中用得太广泛了,我就不信你的系统还没有“状态”。比如我们常用的订单状态或者各种XX状态都可以。Strategy模式使用此模式将一组算法封装为一组对象。通过调用这些对象,可以灵活的改变程序的功能。费超低声道:这个频率太高了,经常用来优化大量的if-else。如果你不知道这个设计模式,别说你关注过费超的公众号!模板方法模式允许子类重写方法的一部分,而不是整个重写,你可以控制子类需要重写哪些操作。胖超低声说:这个模式也是非常高频的模式。业务代码经常会遇到很多相同的部分。我们可以做一个抽象类和子类来实现差异化。如果您还不知道,请快速搜索。同样,它非常频繁。访问者模式提供了一种方便且可维护的方式来操作一组对象。它允许您修改或扩展对象的行为,而无需更改您操作的对象。参考国外文献:http://h5ip.cn/lPtD