常用设计模式
设计模式分类
1.创建型
工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、 建造者模式(Builder)、原型模式(Prototype)、单例模式(Singleton)
2.结构型
适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、 装饰器模式(Decorator)、门面模式(Facade)、享元模式(Flyweight)、 代理模式(Proxy)
3.行为型
解释器模式(Interpreter)、模板方法模式(Template Method)、 责任链模式(Chain of Responsibility)、命令模式(Command)、 迭代器模式(Iterator)、调解者模式(Mediator)、备忘录模式(Memento)、 观察者模式(Observer)、状态模式(State)、策略模式(Strategy)、 访问者模式(Visitor)
六大原则
1.开闭原则(Open Close Principle)
对扩展开放,对修改关闭,想要达到这样的 效果,我们需要使用接口和抽象类
2.里氏代换原则(Liskov Substitution Principle)
里氏代换原 则中说,任何基类可以出现的地方,子类一定可以出现。 LSP 是继承复用的基石,只有当衍生类可以 替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增 加新的行为。
3.依赖倒转原则(Dependence Inversion Principle)
针对接口编程,依赖于抽象而不依赖于具体。
4.接口隔离原则(Interface Segregation Principle)
使用多个隔离的接口,比使用单个接口要好,降低依赖,降低耦合。
5.迪米特法则(最少知道原则)(Demeter Principle)
一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能 模块相对独立。
6.合成复用原则(Composite Reuse Principle)
尽量使用合成/聚合的方式,而不是使用继承
spring中的设计模式
1.简单工厂模式(Factory)
Spring 中的 BeanFactory 就是简单工厂模式的体现,根据传入一个唯一的标识来获得 Bean 对象,但 是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。
场景举例:批量生产、标准化
2.工厂方法模式(Factory Method)
spring中的FatctoryBean
场景举例:流水线生产
3.单例模式(Singleton)
保证一个类仅有一个实例,并提供一个访问它的全局访问点
场景举例:配置文件、日历、IOC 容器
4.原型模式(Prototype)
就是 Java 中的克隆技术,以某个对象为原型,复制出新的对象。
5.代理模式(Proxy)
从结构上来看和 Decorator 模式类似, 但 Proxy 是控制,更像是一种对功能的限制,而 Decorator 是增加职责。Spring 的 Proxy 模式在 AOP 中有体现,比如 JdkDynamicAopProxy 和 Cglib2AopProxy。
特点:
对于被代理人来说,这件事情是一定要做的,但是我自己又不想做或者没有时间做。
对于代理人而言,需要获取到被代理的人个人资料,只是参与整个过程的某个或几个环节。
场景举例:租房中介、售票黄牛、婚介、 经纪人、快递、事务代理、非侵入式日志监听
6.策略模式(Strategy)
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独 立于使用它的客户而变化。
Spring 中在实例化对象的时候用到 Strategy 模式,在 SimpleInstantiationStrategy 有使用。
场景举例:支付系统,微信、支付宝,根据user-agent入参匹配不同的策略。
7.模板方法模式(Template Method)
流程固定,有些步骤不同,运行时才能确定。比如JdbcTemplate,不管是mysql还是oracle,步骤都是:建立连接,准备sql,设置参数,执行sql,获得结果。但是mysql和oracle的数据源是不同的,代码如下:
// JDBC模板依赖于连接池来获得数据的连接,所以必须先要构造连接池
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/spring");
dataSource.setUsername("root");
dataSource.setPassword("123456");
// 创建JDBC模板
JdbcTemplate jdbcTemplate = new JdbcTemplate();
// 这里也可以使用构造方法
jdbcTemplate.setDataSource(dataSource);
// sql语句
String sql = "select count(*) from user";
Long num = (long) jdbcTemplate.queryForObject(sql, Long.class);
8.委派模式(Delegate)
这种模式的原理为类 B 和类 A 是两个互相没有任何关系的类,B 具有和 A 一模一样的方法和属性;并且调用 B 中的方法,属性就是调用 A 中同名的方法和属性。B 好像就是一个受 A 授权委托的中介。第三方的代码不需要知道 A 的 存在,也不需要和 A 发生直接的联系,通过 B 就可以直接使用 A 的功能,这样既能够使用到 A 的各种功 能,又能够很好的将 A 保护起来了,一举两得。
场景:DispatcherServlet
9.适配器模式(Adapter)
Spring AOP 模块对 BeforeAdvice、AfterAdvice、ThrowsAdvice 三种通知类型的支持实际上是借 助适配器模式来实现的,这样的好处是使得框架允许用户向框架中加入自己想要支持的任何一种通知类型。
满足 has-a 的关系,适配器持有被适配的对象。
适配器详细使用可参考:
https://www.jianshu.com/p/43bfb4516dd8
10.装饰器模式(Decorator)
Spring 中用到的包装器模式在类名上有两种表现:一种是类名中含有 Wrapper,另一种是类名中含有 Decorator。基本上都是动态地给一个对象添加一些额外的职责。
装饰器和被装饰器都实现同一个接口,主要目的是为了扩展之后依旧保留 OOP 关系(同宗同源),满足 is-a 的关系。
场景:数据源包装,java输入输出流
备注:装饰器相当于对对象的增强,如果使用继承,相当于对类的增强。
11.观察者模式(Observer)
Spring 中 Observer 模式常用的地方是 Listener 的实现。如 ApplicationListener。
场景:监听器、日志收集、短信通知、 邮件通知
编程思想
1.AOP
Aspect Oriented Programming(面向切面编程)
解耦,专人做专事。
2.OOP
Object Oriented Programming(面向对象编程)
封装、继承、多态。
3.BOP
Bean Oriented Programming(面向 Bean 编程)
一切从 Bean 开始
4.IOC
Inversion of Control(控制反转)
转交控制权(即控制权反转)。
5.DI/DL
Dependency Injection(依赖注入)或者 Dependency Lookup (依赖查找)
依赖注入、依赖查找,Spring 不仅保存自己创建的对象,而且保 存对象与对象之间的关系。先理清关系再赋值。