赞
踩
Spring常用的设计模式:
单例模式需要构造方法私有化,提供公共静态方法获取单例对象
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,类似可以参考java中浅拷贝和深拷贝(一般都是浅拷贝)
建造者(Builder)模式的主要角色如下:
和工厂模式的区别:
由程序员创建代理类或特定工具自动生成源代码再对其编译,在程序运行前代理类的 .class 文件就已经存在了,同时目标类需要实现父接口
很明显如果女人改变了,媒人也需要修改信息,违背了OCP开闭原则
运行时在内存动态创建代理,利用jdk自带的Proxy工具创建代理,并且实现InvocationHandler接口,而且目标类需要实现父接口或继承父类
也是在运行时内存动态创建代理类或实现接口,目标类不用实现或继承类,又叫子类代理,代理类是目标类的子类,比如springAop中的ObjenesisCglibAopProxy代理实现
适配器
桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
桥接(Bridge)模式包含以下主要角色:
装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
装饰器模式主要包含以下角色:
外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
外观(Facade)模式包含以下主要角色:
享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。
享元模式的定义提出了两个要求,细粒度和共享对象。因为要求细粒度,所以不可避免地会使对象数量多且性质相近,此时我们就将这些对象的信息分为两个部分:内部状态和外部状态。
享元模式的主要角色有如下:
备注:常见的-128~127的整型包装类常量池(初始化就创建好)以及字符串常量池都是利用亨元模式,大大节省内存空间,物理上放在堆内存中,逻辑上放在方法区(jdk1.8后是元空间的实现)
组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构设计模式。
层层嵌套,类似与链表结构;整体-部分结构中部分数目不宜过多,特别是部分如果差别很大,使结构复杂,不易读难维护;不容易使用继承增加构建新方法。
组合模式包含以下主要角色。
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
观察者模式使用三个类 Subject、Observer 和 Client。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。
代码大致这样......
- package com.demon.design.observer;
-
- import java.util.ArrayList;
- import java.util.List;
-
- /**
- * 个人钱包信息,管理订阅者
- *
- * @since 2022/06/23
- */
- public class Wallet {
- private List<PaymentObject> observers = new ArrayList<>();
- private double money;
-
- public void addObserver(PaymentObject observer) {
- observers.add(observer);
- }
-
- public void removeObserver(PaymentObject observer) {
- observers.remove(observer);
- }
-
- public void setState(int state) {
- // 进账了...
- notifyAllObservers();
- }
-
- private void notifyAllObservers() {
- for (PaymentObject paymentObject : observers) {
- paymentObject.phoneTooltip();
- }
- }
- }
- package com.demon.design.observer;
-
- /**
- * 定义被欠款方观察者,观察欠款方钱包,有入账提示要还款。。。。。
- *
- * @since 2022/06/23
- */
- public abstract class PaymentObject {
- protected Wallet wallet;
-
- public abstract void phoneTooltip();
- }
- package com.demon.design.observer;
-
- public class PaymentBank extends PaymentObject{
-
- public PaymentBank(Wallet wallet) {
- this.wallet = wallet;
- this.wallet.addObserver(this);
- }
-
- @Override
- public void phoneTooltip() {
- System.out.println("你钱包有一笔钱新入账,可以还钱给工商银行了吧!");
- }
- }
- package com.demon.design.observer;
-
- public class PaymentWife extends PaymentObject{
-
- public PaymentWife(Wallet wallet) {
- this.wallet = wallet;
- this.wallet.addObserver(this);
- }
-
- @Override
- public void phoneTooltip() {
- System.out.println("你钱包有一笔钱新入账,可以上交给老婆了吧!");
- }
- }
- package com.demon.design.observer;
-
- public class PaymentChildren extends PaymentObject{
-
- public PaymentChildren(Wallet wallet) {
- this.wallet = wallet;
- this.wallet.addObserver(this);
- }
-
- @Override
- public void phoneTooltip() {
- System.out.println("你钱包有一笔钱新入账,可以给儿子交学费了吧!");
- }
- }
- package com.demon.design.observer;
-
- public class MainRunner {
- public static void main(String[] args) {
- Wallet wallet = new Wallet();
-
- PaymentObject paymentBank = new PaymentBank(wallet);
- PaymentObject paymentWife = new PaymentWife(wallet);
- PaymentObject paymentChildren = new PaymentChildren(wallet);
-
- // 钱包入账了...
- wallet.setState(100);
- // 通知大佬们可以向我要钱了...
- }
- }
你钱包有一笔钱新入账,可以还钱给工商银行了吧!
你钱包有一笔钱新入账,可以上交给老婆了吧!
你钱包有一笔钱新入账,可以给儿子交学费了吧 !
备注:可以参考事件总线框架EventBus,利用观察者模式做为消息队列,只限于单个jvm中(单进程);JdbcTemplate中query方法用到了模板模式和观察者模式,使用的是同步回调方式~~~
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式,在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
策略模式的主要角色如下:
命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理
命令模式包含以下主要角色:
迭代器模式(Iterator Pattern)用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。每次都需要新增容器实现类和迭代器实现类
迭代器模式主要包含以下角色:
备注:借鉴Collection子集iterator()方法,由于正常集合在遍历过程中改变集合结构(增删),有可能导致不确定性异常,因为每次删除新增都有可能让集合元素重新排布,迭代器模式可以避免这种情况,实际上就是在原有集合上面包装记录有效位置一层,逃离了通过索引位置index的操作。
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
使用场景:
1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3、可动态指定一组对象处理请求。
职责链模式主要包含以下角色:
备注:常用的两种实现方式,用链表存储处理器和用数组存储处理器,常用的框架有Filter和Interceptor
状态变化影响某一行为,比较鸡肋
分为同步和异步回调,比模板模式更灵活,JdbcTemplate、RedisTemplate等都有应用
- import lombok.Data;
- import org.springframework.util.Assert;
-
- import java.io.Serializable;
-
- @Data
- public class Person implements Serializable {
- private String name;
- private int age;
-
- public Person() {
-
- }
-
- public Person(String name, int age) {
- this.name = name;
- this.age = age;
- }
-
- @Override
- public String toString() {
- return "Person{" +
- "name='" + name + '\'' +
- ", age=" + age +
- '}';
- }
-
- public void setName(String name) {
- this.name = name;
-
- }
-
- public <T> T query(String choose, ResultSetExtractor<T> extract) {
- Assert.notNull(choose, "SQL must not be null");
- Assert.notNull(extract, "extract must not be null");
-
- class CallBackHand implements ICallBackHand<T> {
- public T doInState(String manJson) {
- System.out.println(choose + " 调用第三方执行了!");
- return extract.extractData("第三方返回数据");
- }
- }
- return this.execute(new CallBackHand());
- }
-
- public <T> T execute(ICallBackHand<T> backHand) {
- System.out.println("获取第三方的客户工具");
- return backHand.doInState("第三方返回结果");
- }
-
- public static void main(String[] args) {
- Person person = new Person();
- person.query("hello", cho -> {
- System.out.println("返回需要的执行结果");
- return new Man();
- });
- }
-
-
- }
-
-
- interface ICallBackHand<T> {
- T doInState(String manJson);
- }
-
- @FunctionalInterface
- interface ResultSetExtractor<T> {
- T extractData(String cho);
- }
也叫多路复用路由监听处理
buffer:缓存数据,写入渠道或从渠道读取。
channel:双向(可读写),可以异步读写,只支持批量(buffer)读写
selector:监听多个渠道是否做好读写准备,配合非阻塞IO实现单个线程管理多个渠道。
也叫快照(Snapshot)模式,指在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。主要用在数据防丢失,恢复,撤销等场景,备忘录模式更侧重代码的设计和实现,且备份对象仅仅可读。
对大数据量处理时,可以针对不同应用场景指定合理的备份措施,如果需要做好原数据备份,可以采用低频率全量备份和高频率增量备份
按照语法规则解释,为不同应用场景提供支持
定义了一个单独的对象,来封装一组对象之间的交互,将这组对象之间的交互委派给与中介对象交互,来避免对象之间的直接交互。
中介模式的设计思想和中间层很像,通过引入中介这个中间层,将一组对象之间的交互关系从多对多(网状关系)转换为一对多(星状关系)。这组对象之间可以是单向交互也可以是双向交互,适应错综复杂的应用场景,通过中介对象来统一调度。一般对象之间交互较为复杂时才考虑,比如飞机航线的中台...
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。