设计模式
文章平均质量分 93
设计模式模式专栏总结囊括日常设计和开发的常用设计模型和案例分析
码农架构
专注于系统架构、高可用、高性能、高并发类技术分享
展开
-
微服务的架构下,如何根据业务抽象出适合自己系统的组件?
导读:基础SpringBoot/SpringCloud微服务的架构下,我们或多或少会根据业务抽象出适合自己系统的组件或SDK,来应对对内、对外的拓展。在SpringBoot/SpringCloud先前介绍了一些,如:@Conditional 来指定指定条件的时候才将某个 bean 加载到应用上下文中。 @FunctionalInterface 函数式接口申明 @JsonTypeInfo 在Java类继承的情况下如何实现父类及子类的JSON序列化与反序列化。等等其他的注解标识,极大简化了...原创 2021-09-01 14:14:35 · 679 阅读 · 2 评论 -
☕️【系统设计】如何设计出优雅且实用的 API 接口
记得最开始的时候在设计接口的时候规范还没有那么多,因为前后端还没分离。不管是前端还是后端都是一个人开发,为了追求"效率"。所谓的接口规范百花齐放,各有各自的一套。后来前后端分离,哪些为了追求"效率"而写的代码,重构起来的代码也是头疼。所以到了现在已经基本固定基本的机构体系,针对业务得不同还可以垂直拓展。如何构建这几个部分每个公司要求都不同,没有什么“一定是最好的”标准,但一个优秀的后端接口和一个糟糕的后端接口对比起来差异还是蛮大的,其中最重要的关键点就是看是否规范!在设计接口时,有很多因素要考虑原创 2021-08-02 11:14:01 · 950 阅读 · 1 评论 -
装饰模式(DecoratorPattern)
定义动态的给一个对象增加一些职能,相对与生成子类更加灵活。结构图角色与理解装饰模式共分为四种角色: Component(抽象构件):具体构件与抽象装饰类的共同父类,声明具体构件中实现的业务方法,它的出现能够让客户端一致的透明的对待装饰前和装饰后的类 ConcreteComponent(具体构件):抽象构件的子类,实现具体的业务方法 Decorator(抽象装饰类):抽象构件的子类,内部维持一个抽象构件的引用,通过该引用调用具体构件的业务方法 ConcreteDe.原创 2020-11-29 12:41:28 · 216 阅读 · 0 评论 -
访问者模式(VisitorPattern)
定义被访问对象放开胸怀,接受不同的访问者进行访问,且访问者对被访者数据进行处理。结构图角色与理解访问者模式共分为五种角色: Visitor(抽象访问者):内部声明一个对每一个具体元素进行访问的操作。 Concrete Visitor(具体访问者):继承抽象访问者,实现对所有具体元素的一种访问操作。 Element(抽象元素):声明accept()方法,以抽象访问者作为参数,供访问者访问。 Concrete Element(具体元素):实现accept()方法,调用访.原创 2020-11-29 13:18:55 · 228 阅读 · 0 评论 -
模板方法模式(StrategyPattern)
定义将一系列方法中的固定方法提取到抽象层,完成代码的复用,且通过子类的重写行为改变类的模板方法的功能的改变。结构图角色与理解模板方法模式共分为两种角色: Abstract Class(抽象类):抽象类,提供默认实现的具体方法与供子类实现的抽象方法。 Concrete Class(具体子类):实现父类声明的抽象方法,重写父类的逻辑。 抽象类提供模板方法(包含基本方法的执行顺序,可被重写),里边包含具体方法(子类的通用方法),抽象方法(供子类重写的方法),钩子方法(供子类重.原创 2020-11-29 13:16:38 · 186 阅读 · 0 评论 -
策略模式(StrategyPattern)
定义定义一系列算法,并将这些算法封装起来,并让他们能够相互替换,也称为政策模式(Policy)。结构图角色与理解策略模式共分为三种角色: Context(上下文环境):持有抽象策略类,调用策略方法。 Strategy(抽象策略类):声明策略方法。 Concrete Strategy(具体策略类):实现策略方法。 Context持有State的引用,完成对ConcreteStrategy中策略方法的调用。核心代码抽象策略类public interface .原创 2020-11-29 13:15:06 · 278 阅读 · 0 评论 -
状态模式(StatePattern)
定义复杂对象不同状态下的行为封装与状态转换。结构图角色与理解状态模式共分为三种角色: Context(上下文环境):将自身的状态与行为分离出去,封装成状态类,持有抽象状态类的引用,根据自身属性变换更换具体状态类。 State(抽象状态类):具体状态类的抽象,可以持有上下文环境的引用来更换状态。 Concrete State(具体状态类):实现不同状态下的不同行为。 上下文环境引用抽象状态类完成行为的调用,状态类的状态变化可以有上下文环境处理,也可以由状态类处理。 .原创 2020-11-29 13:08:40 · 136 阅读 · 1 评论 -
观察者模式(ObserverPattern)
定义定义对象之间的一种一对多依赖关系,使得每一个对象发生状态的变化时,其相关依赖对象皆得到通知并被自动更新,又称为发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependence)模式。结构图角色与理解观察者模式共分为四种角色: Subject(目标类):被观察的对象,内部定义一个观察者集合,并提供管理方法,定义通知方法notify()。 ConcreteSubjec.原创 2020-11-29 13:04:46 · 882 阅读 · 0 评论 -
备忘录模式(MementoPattern)
定义在不破坏封装的前提下,捕获对象的内部状态,并在对象外存储这个内部状态,以便将来回滚到这一状态。结构图角色与理解备忘录模式共分为三种种角色: Originator(原发器):需要被记录状态的类 Memento(备忘录):记录原发器状态的类,内部含有原发器的部分属性或者全部属性,不能被其他类所修改 Caretaker(管理者):管理备忘录 原发器创建备忘录记录此刻内部各属性的值,将备忘录交给管理者管理,回滚状态时,从管理者中获取备忘录,重置内部属性核心代码原发.原创 2020-11-29 13:02:34 · 205 阅读 · 0 评论 -
中介模式(MediatorPattern)
定义提供一个中介者完成对一系列操作的封装,降低对象间的系统耦合度。中介者模式又称为调停者模式。结构图 角色与理解中介模式共分为四种角色: Mediator(抽象中介者):声明具体中介者公共的方法,被抽象同事类所引用,供具体同事类适用 ConcreteMediator(具体中介者):实现抽象中介者公共的方法,引用具体同事类完成一系列操作的封装 Colleague(抽象同事类):声明公共方法,引用抽象中介者,供子类调用 ConcreteColleague(具体同...原创 2020-11-29 13:00:42 · 289 阅读 · 0 评论 -
解释器模式(InterpreterPattern)
定义定义一个语言的文法,并创建一个解释器去解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码。结构图角色与理解解释器模式共分为三种角色: AbstractExpression(抽象表达式):终结符表达式与非终结符表达式的共同父类,声明了抽象的解释行为。 TerminalException(终结符表达式):抽象表达式的子类,包含文法中终结符的解释操作。 NonterminalException(非终结符表达式):抽象表达式的子类,实现了文法中非终结符的解释操作,原创 2020-11-29 12:58:23 · 251 阅读 · 0 评论 -
命令模式(CommandPattern)
定义将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。其别名为动作(Action)模式或事务(Transaction)模式。结构图角色与理解命令模式包含如下角色: Command(抽象命令类):所有具体命令类的父类,一般定义为抽象类或者接口,声明执行请求的execute()方法等。 Concrete Command(具体命令类):继承抽象命令类,持有接收者的引用,在execute()等方法中调用接收者的方法已原创 2020-11-29 12:55:11 · 208 阅读 · 0 评论 -
责任链模式(ChainOfResponsibilityPattern)
定义将请求发送者和请求接受者解耦,让请求的接受者形成链式操作,所有人都能够接受接受到请求,直到有人处理请求。结构图角色与理解责任链模式包含如下角色 Handler(抽象处理者):所有具体处理者的父类,一般定义为抽象类,定义了一个统一的处理入口,以及维持了一个抽象处理者类型对象的引用,用于形成链式处理者 ConcreteHandler(具体处理者):继承抽象处理者,实现统一的处理入口,将自己无法处理的请求转发给下一个处理者 处理链的形成是在客户端完成的,以及处理链的顺序也是原创 2020-11-29 12:52:26 · 167 阅读 · 0 评论 -
代理模式(ProxyPattern)
定义通过一个代理对象或者占位符来控制对原对象的访问。结构图角色与理解代理模式共分为四种角色: Subject(抽象主题角色):真实主题角色与代理主题角色的共同父类,可以是具体类、抽象类、接口,客户端针对抽象主题角色编程 RealSubject(真实主题角色):实现具体业务方法的类,被代理主题角色调用 Proxy(代理主题角色):持有真实主题角色的引用,在调用真实主题角色的具体业务方法之前或者之后添加其它操作 客户端面对抽象主题角色编程,调用抽象主题角色实际上调用的是代原创 2020-11-29 12:48:05 · 201 阅读 · 0 评论 -
享元模式(FlyweightPattern)
定义将系统中细粒度的相同的或者相似的对象以共享的方式存放在享元池中供客户端使用。结构图角色与理解享元模式共分为四种角色: Flyweight(抽象享元类):通常是一个接口或者是抽象类,在抽象享元类中声明了共享享元类的公共方法,通过这些方法可以访问享元类的内部数据(内部状态),也可以设置享元类的外部数据(外部状态) Concrete Flyweight(共享具体享元类):实现抽象享元类,其实例称为享元对象,一般为单例模式,提供唯一的享元对象 UnsharedConcr.原创 2020-11-29 12:45:46 · 185 阅读 · 0 评论 -
门面模式(FacadePattern)
定义又称为门面模式,为子系统中一组接口提供一个统计的入口。外观模式定义了一个高层接口,方便了客户端与子系统之间的访问。结构图角色与理解外观模式共分为四种角色: Facade(外观角色):客户端调用子系统功能的入口,正常情况下,它将所有客户端发过来的请求委托给相应的子系统处理 SubSystem(子系统):可以是一个类、一组类、一个模块或者是一个系统,可以被客户端直接调用或者被外观类调用。子系统并不知道外观的存在,对于它而言外观也是客户端核心代码外观角色publi.原创 2020-11-29 12:43:11 · 184 阅读 · 0 评论 -
组合模式(CompositePattern)
定义组合多个对象形成树形结构以表示“整体-部分”的关系的层次结构。组合模式对叶子节点和容器节点的处理具有一致性,又称为整体-部分模式。结构图角色与理解组合模式共分为三种角色: Component(抽象构件):叶子构件与容器构件共同继承的父类或者是共同实现的接口,该角色中包含所有子类共有方法的声明和实现,在抽象构件中定义了管理子构件的方法,新增构件、删除构件、获取构件。 Leaf(叶子构件):表示叶子节点,没有子节点,对于继承父类的管理子节点的方法以抛出异常的方式处理。.原创 2020-11-29 12:39:05 · 3268 阅读 · 0 评论 -
桥接模式(BridgePattern)
定义将俩个维度分离,使他们可以独立变化。又称为柄体(Handle and Body)模式或者接口(interface)模式。结构图角色与理解桥接模式包含如下角色: Abstraction(抽象类):用于定义抽象类的接口,一般为抽象类而不是接口,其中维持一个Implementor的引用 RefinedAbstraction(扩充抽象类):继承或者实现抽象类,通常情况下为具体类而不是抽象类,实现抽象类中定义的抽象业务方法,在具体业务方法中可以调用Implementor中定义.原创 2020-11-29 12:36:47 · 289 阅读 · 0 评论 -
适配器模式(AdapterPattern)
定义将一个接口转换客户希望的另一个接口,使接口不兼容的那些类能够一起工作,又名包装器(Wrapper)。适配器模式可以为对象适配器模式,也可以是类适配器模式结构图角色与理解对象适配器模式包含如下角色 Target(目标抽象类):定义客户所需接口,可以是接口、抽象类或者具体类 Adapter(适配器):继承实现Target关联Adaptee,完成接口的转换 Adaptee(适配者):定义存在的接口被适配器适配 对象适配器的核心是适配器继承或者实现目标类委派适配者(.原创 2020-11-28 23:51:43 · 272 阅读 · 0 评论 -
建造者模式(BuilderPattern)
定义将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示结构图角色与理解建造者模式主要包含如下几个角色: Builder(抽象建造者):构建产品对象部件方法的抽象接口,可以是接口也可以是抽象类,供指挥者使用;方法包含两类bulidX()与getResult()方法 ConcreteBuilder(具体建造者):实现抽象建造者接口,一个具体建造者对应一中具体的产品对象 Product(产品角色):建造者模式最终产物 Director(指挥者):又称为导原创 2020-11-28 23:44:51 · 237 阅读 · 0 评论 -
原型模式(PrototypePattern)
定义按实例原型创建对象结构图角色与理解原型模式共有以下几种角色: Prototype(抽象原型类)定义clone方法的接口,类型为接口、抽象类或者具体的类,是所有具体原型类的父类 ConcretePrototype(具体原型类)实现clone方法的实现了,可以为多个类,提供不同的clone方式 Client(客户类)让一个原型对象复制新的对象 原型方法的核心是如何实现clone方法,不同的clone方法最终的效果也是不一样的深拷贝与浅拷贝浅拷贝(Sh..原创 2020-11-28 23:37:36 · 330 阅读 · 0 评论 -
抽象工厂模式(AbstractFactoryPattern)
定义提供一个创建一系列相关或者相互依赖的类的工厂接口,他包含多个产品类的工厂方法,及一个工厂类能够创建多个产品。结构图角色与理解抽象工厂模式总共包含如下四种角色: AbstractFactory(抽象工厂):包含多个创建同一产品族中产品的抽象工厂方法的抽象类,一个抽象工厂定义了一个输出的产品族 ConcreteFactory(具体工厂):抽象工厂的实现 AbstractProduct(抽象产品):所有具体产品的父类,这里指单一产品的父类而不是一个产品族的共同父类 .原创 2020-11-28 23:34:53 · 197 阅读 · 0 评论 -
工厂方法模式(FactoryMethodPattern)
定义定义一个用于创建对象的接口,让子类决定将哪一个产品实例化。工厂方法模式让一个类的实例化延迟到工厂类的子类。工厂方法模式简称为工厂模式(Factory Pattern),又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)。机构图角色与理解工厂模式中的类共分为以下几种角色: Factory(抽象工厂):提供具体工厂所需要实现的接口集合,供客户端调用 ConcreteFa.原创 2020-11-28 23:28:33 · 210 阅读 · 0 评论 -
简单工厂模式(SimpleFactoryPattern)
定义定义一个工厂类,并提供一个抽象工厂方法,该方法通过传入不同的入参而制造出特定的产品,且所有产品具有共同的父类。结构图角色与理解简单工厂模式中的类存在以下几种角色: Product(抽象产品角色):所有具体产品的父类 Factory(工厂角色):实现产品创建逻辑的类 ConcreteProduct(具体产品角色) : 继承自抽象产品类的具体实现类 工厂类中包含静态工厂方法,出参为产品类,客户端通过传入不同入参去调用静态工厂方法去获取不同的具体产品类 工厂类中.原创 2020-11-28 23:10:05 · 220 阅读 · 0 评论 -
单例模式(SingletonPattern)
确保某个类只有一个实例,并且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式只包含一种角色那就是单例角色,Singleton(单例)。 单例模式有三个要点: 这个类只有一个实例 它自行创建这个实例 它自行向整个系统提供这个实例 饿汉式(线程安全)public class EagerSingleton { private static EagerSingleton eagerSingleton = new EagerSingl..原创 2020-11-28 22:42:16 · 444 阅读 · 1 评论 -
设计模式原则
开放封闭原则(Open CLose Principle,OCP)一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。开闭原则即对拓展开放,对修改关闭,要想在功能新增的时候不修改原先的代码,即程序中使用的是抽象类或者接口,我们新增的子类或者实现,这样才能保障我们拓展功能的时候不用修改原先的代码,所以说抽象化是开闭原则的关键。里氏替换原则(Liskov Substitution Principle,LSP)所有引用基类(父类)的地方必须能透明地使用其子原创 2020-11-09 15:12:26 · 138 阅读 · 0 评论