zoukankan      html  css  js  c++  java
  • 设计模式的一些心得

    1、Builder模式

    应用场景:应用于属性比较多的多的情况,简化构造方法,想要几个参数的构造方法就build参数

    白话创建:如果一个类要使用Builder模式,就创建一个内部类,这个内部类有几个特点,属性和外部类相同、get 方法和 set 方法为一体,返回值为 this、一个 builder 方法,功能是创建这个内部类的实例、 一个 build 方法,功能是创建一个外部类的实例,将内部类所有属性赋给外部类的所有属性

    2、工厂模式

    应用场景:解耦和,将创建对象的权力分离出来成一个工厂,具体实现就是spring的 IOC

    白话创建:一个抽象生产者,多个具体生产者实现它,一个工厂方法,接收不同的生成信号,生产不同的产品,利用了里氏替换原则,声明返回父类,而返回到是具体子类

    3、单例模式

    应用场景:一个类只有一个实例,也叫单态模式,作用是提高性能,减少创建实例开销

    白话创建:创建单例有几种方式,懒汉模式、饿汉模式、内部类模式、枚举创建模式,最推荐的就是枚举,因为种无论是序列化还是反射都无法破坏

    4、代理模式

    应用场景:通过代理对象可以实现增强,比如在执行真实对象功能之前或之后增加日志打印或事物控制,最有代表性的是mybatis,你只需要定义一个Mapper,它会自动创建一个代理实现类

    白话创建:代理类持有(关联)真实类的引用,执行代理类时,同时也可以执行真实类的逻辑,有静态代理、和动态代理(jdk代理、cglib代理)

    5、策略模式

    应用场景:把各种可能封装成策略,减少逻辑判断,比如 if ,大量的 if 判断会导致代码难以维护,这时就可以使用此模式或卫语句

    白话创建:有三种角色,抽象策略、具体策略和上下文类,一个抽象策略(通常为一个接口,如果各个子类有重复逻辑,就可以定义为一个抽象类),多个具体策略(通常为一组封装了算法的类),上下文类(封装类),持有抽象策略的引用,用时传入具体策略,也是对策略二次封装,避免高层模块直接调用策略

    6、模板模式

    应用场景:将有共同行为的类封装成模板,减少代码冗余,例如:泡茶或咖啡都有以下几步骤,1、烧开水    2、把(咖啡或茶)倒入杯中   3、倒入开水   4、加入调料(糖)

    白话创建:一个抽象类定义两种方法,模板方法和基本方法,模板方法定义一方法的具体流程(例如:1、烧开水    2、把(咖啡或茶)倒入杯中   3、倒入开水   4、加入调料(糖)),基本方法又分为三种,具体方法(定义每个子类都存在的重复逻辑,例如:烧开水和倒入开水),抽象方法(这些逻辑要延迟到子类,例如:把(茶或咖啡)倒入杯中,因为此时你还不知道是茶还是咖啡),钩子方法(一个是一个默认的空方法,例如:加入调料(糖),像茶就不需要加糖)

    7、适配器模式

    应用场景:将我们不合适的接口适配成我们需要的接口,logback日志为了统一,就定义了一些适配类,表面上是logback的,实际里面使用的是别的日志框架的

    白话创建:一个接口里定义一些必用的抽象方法,其实现类里关联一个需要适配的类,所有重写方法都是用适配类的方法来实现的(简单的说就是偷天换日、偷梁换柱、狸猫换太子)

    8、装饰器模式

    应用场景:将一个对象增加一些额外的功能,例如:你要用过滤器过滤掉一些非法字符,这时你自定义一个类,去包装这个请求对象

    白话创建:装饰类于被装饰类(目标类)实现同一个接口,装饰类不但实现了这个接口,而且还关联这个接口,用时传入具体的被装饰类,然后就可以除了被装饰的方法,还可以加入自己的逻辑(例如:mybatis的cache接口,有 9 个装饰子类,1 个被装饰子类)

    9、观察者模式

    应用场景:也叫发布-订阅模式,一个对象的状态改变要通知其他对象时,例如:MQ,只要消费者订阅了MQ,生产者发送每一条消息时,都会通知消费者

    白话创建:定义一个接口(手机接口,里面有一个接电话的方法),每个观察者实现这个接口,被观察者定义一个观察者的集合(手机集合,哪个有手机才能打电话),和一个添加观察者(手机)的方法,一旦被观察者有状态改变,就遍历所有的观察者(手机),调用它们的通知方法(接电话方法)去通知它们

    10、状态模式

    应用场景:和策略模式差不多

    白话创建:状态模式类似于策略模式,不同的时策略模式是用户自己传入策略到上下文中,然后根据传入的策略执行策略方法,用户使用时必须提前知道所有策略,用户权力过大,如果传入不存在的策略,就无法执行,而状态模式是用户只能选择状态类下的方法来生成不同的策略,限制了用户的行为,就像静态常量和枚举类的区别

    只要你不觉得尴尬,那尴尬的就是别人
  • 相关阅读:
    前沿技术解密——VirtualDOM
    Ques核心思想——CSS Namespace
    Unix Pipes to Javascript Pipes
    Road to the future——伪MVVM库Q.js
    聊聊CSS postproccessors
    【译】十款性能最佳的压缩算法
    Kafka Streams开发入门(9)
    Kafka Streams开发入门(8)
    【译】Kafka Producer Sticky Partitioner
    【译】99th Percentile Latency at Scale with Apache Kafka
  • 原文地址:https://www.cnblogs.com/wujiaxing/p/11181299.html
Copyright © 2011-2022 走看看