设计模式学习

设计模式概述

设计模式是人们长期的软件开发中的一些经验的总结,是对某些问题经过实践检验的特定的解决方法。一共有36种。简而言之,设计模式就是可以帮助设计者更快更好的完成系统设计。所说的设计模式通常指的就是GOF模式。GOF(gang of four)四人组。

这23种设计模式有两种分类方式。

  • 根据目的划,即根据设计模式是用于何种工作来划分的。这种可以分为创建型模式、结构型模式和行为型模式。
  • 根据范围划分,即根据设计模式主要作用于类上还是主要作用于对象上来划分。可分为类模式、对象模式两种。

GoF设计模式的分类

 面向对象的设计原则

        1.单一职责原则

单一职责原则规定一个类应该有且仅有一个引起他变化的原因,简单来说,一个类应该只负责一个职责;否则,应该进行拆分。

        2.开闭原则

开闭原则是面向对象设计中最基础的设计原则,开闭原则规定一个软件实体应该对扩展开放,对修改关闭。

        3.里氏替换原则

里氏替换原则是继承复用的基石。该原则规定所有引用基类的地方必须透明地使用其子类的对象。简单来说,就是所有使用基类代码的地方,如果换成了子类对象还能够正常运行,则满足这个原则。否则就是继承关系有问题,所以这个原则可以用来判断继承关系是否合理。

        4.依赖倒置原则

依赖倒置原则的核心思想:依赖约定而不是依赖具体实现,即面向接口编程。对象的依赖关系有三种传递方式。

  • 通过构造方法传递依赖对象,即构造方法的参数是需要依赖的接口类型
  • 通过setter方法传递依赖对象,即构setter方法的参数是需要依赖的接口类型
  • 接口声明依赖,即接口方法的参数是需要依赖的接口类型

       5.接口隔离原则

接口隔离原则要求尽量将庞大臃肿的接口拆分成更小更具体的接口。一个类对另一个类的依赖应该建立在最小接口上。

        6.迪米特法则

迪米特法则又被称为最少知道原则。指一个软件实体应该尽少的与其他实体发生相互作用。

        7.合成复用原则

合成复用原则是指尽量使用组合/聚合的方式,而不是继承关系达到软件复用的目的。

工厂方法模式

简答工厂方法模式又被称为静态工厂方法模式,不属于GoF23中设计模式之一。是工厂模式当中最简单的一个,一个特殊的实现。

创建的产品不多且逻辑不复杂时可以考虑简单工厂模式,简单工厂模式违背了开闭原则。工厂模式是简单工厂的进一步抽象。主要有以下角色:

  • 抽象产品:定义产品的规范,描述了产品的主要特性和功能
  • 抽象工厂:提供了创建产品的接口,声明创建方法,该方法返回值为抽象值产品类型,调用者可以通过抽象工厂接口访问具体的工厂的方法来创建产品
  • 具体产品:实现抽象产品所定义的接口,由具体工厂创建
  • 具体工厂:实现抽象工厂中的抽象创建方法,完成某个具体产品的创建,具体工厂和具体产品之间存在对应关系。

工厂方法模式的优点:

  • 客户只需要具体工厂的名称就可以得到要的产品,无须知道产品的具体创建过程
  • 基于多态,便于对复杂逻辑进行封装管理,无须对原工厂进行任何修改,满足开闭原则
代理模式

代理模式就是单一职责原则的体现,比如房产中介、婚介、经纪人等等就是代理模式的实际体现。

代理模式包含的角色

  • 抽象主题:通过接口或者抽象类声明业务方法
  • 真实主题:实现了抽象类中的具体业务,是实施代理的目标对象,即代理对象所代表的真实对象,是最终要引用的对象。
  • 代理:提供了与真实主题相同的接口,其内部有对真实主题的引用,可以访问、控制或扩展真实主题的功能

代理模式分为静态代理跟动态代理。

1.静态代理:

由开发者针对抽象主题编写相关的代理类实现,编译后生成代理的class文件。静态代理在编译时就能实现,代理关系在编译期就已经绑定,编译完成后代理类是一个实际的class文件。

2.动态代理

动态代理是在运行时动态生成的,即编译完成之后没有实际的代理类class文件,而是运行时动态生成的代理类字节码,并加载到JVM中。

静态代理的方式简单直观但是要手工编写代理对象。如果被代理的对象中方法要调整则要修改很多东西会违背开闭原则。动态代理运用到反射机制就可以解决这个问题。JDK动态代理的核心API是java.lang.reflect包下面的InvocationHandler接口和proxy类。

InvocationHandler接口是代理方法的调用处理程序,负责为代理方法提供业务逻辑。

proxy类负责动态创建代理类及其实例。

JDK动态代理实面向接口的代理实现,所以要求被代理的目标对象必须通过抽象主题接口进行定义否则无法实施代理。在实际开发中情况更加复杂,如果需要代理的目标并非通过接口定义就可以使用CGLIB实现动态代理。

        CGLIB是一个功能强大的高性能的代码生成库,可以为没有实现接口的类提供代理,与JDK很好地形成互补。但CGLIB对于final类或者final方法无能为力。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值