GOF23种设计模式
内容
设计模式在于理解,不在于形式。
不要为了套用设计模式而使用设计模式,而是,在业务上遇见问题时,很自然地想到设计模式作为一种解决方案。
总结
分类 | 设计模式 |
|---|---|
创建型 | 工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、创建者模式(Builder)、原型模式(Prototype)、单例模式(Singleton) |
结构型 | 适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、装饰器模式(Decorator)、门面模式(Facade)、享元模式(Flyweight)、代理模式(Proxy) |
行为型 | 解释器模式(Interpreter)、模板方法模式(Template Method)、责任链模式(Chain of Responsibility)、命令模式(Commond)、迭代器模式(Iterator)、调解者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式(State)、策略模式(Strategy)、访问者模式(Visitor) |
设计模式之间的关联和对比
单例模式和工厂模式
实际业务代码中,通常会将工厂类设计为单例。
策略模式和工厂模式
工厂模式包含工厂方法模式和抽象工厂模式是创建型模式,策略模式是属于行为型模式。
工厂模式主要目的是封装好创建逻辑,策略模式接受工厂创建好的对象,从而实现不同的行为。
策略模式和委派模式
策略模式是委派模式内部的一种实现形式,策略模式接受工厂创建好的对象,从而实现不同的行为。
模板方法模式和工厂模式
工厂方法是模板方法的一种特殊实现。
对于工厂方法模式的create() 方法而言,相当于知识一个步骤的模板方法模式。这一个步骤交给子类去实现。而模板方法呢,将needHomework()方法和checkHomework()方法交给子类实现,needHomework()方法和checkHomework()方法有属于父类的某一个步骤且不可变更。
#### 模板方法模式和策略模式
模板方法和策略模式都有封装算法。
策略模式是使不同算法可以互相替换,且不影响客户端应用层的使用。
模板方法是针对定义一个算法的流程,将一些有细微差异的部分交给子类实现。
模板方法模式不能改变算法流程,策略模式可以改变算法流程且不可替换。策略模式通常使用if..else..等条件分支语句。
WechatPay、JDPay、AliPay是交给用户选择且相互替代解决方案。而JdbcTemplate下面的子类是不能相互替代的。
策略模式中的queryBalance()方法虽然在pay()方法中也有调用,但是这个逻辑知识处于程序健壮性考虑。用户完全可以自主调用queryBalance()方法。而模板方法模式中的mapRow()方法一定要在获得ResultSet之后方可调用,否则没有意义。
#### 装饰着模式和静态代理模式
装饰着模式关注点在于给对象动态添加方法,而代理更加注重控制对象的访问。
代理模式通常会在代理类中创建被代理对象的实例,而装饰着模式通常把被装饰者作为构建参数。
装饰者和代理者虽然都持有对象引用,但是逻辑处理重心是不一样的。
#### 装饰者模式和适配器模式
装饰者模式和适配器模式都是属于包装器模式(Wrapper Pattern)
装饰者模式可以实现被装饰者与相同的接口或者继承被装饰者作为它的子类,而适配器和被适配者可以实现不同的接口。
装饰者和适配器都是对SignService的包装和扩展,属于装饰器模式的实现形式。但是装饰者需要满足OOP的is-a关系,不管如何包装都有共同的父类。而适配器主要解决兼容性问题,不一定要统一弗雷,上图LoginAdapter和RegisterAdapter就是兼容不同功能的两个类,但RegisterForQQAdapter需要注册后自动登录,因此即需要继承RegisterAdapter又继承了LoginAdapter。
#### 适配器模式和静态代理模式 适配器可以结合静态代理来实现,保存被适配对象的引用,但不是唯一的实现方式。
适配器模式和策略模式
在适配业务复杂的情况下,利用策略模式优化动态适配逻辑。
Spring中常见的设计模式对比
设计模式 | 一句话归纳 | 举例 |
|---|---|---|
工厂模式(Factory) | 只对结果负责,封装创建过程 | BeanFactory、Calender |
单例模式(Singleton) | 保证独一无二 | ApplicationContext、Calender |
原型模式(Prototype) | 拔一根猴毛吹出千万个 | ArrayList、PrototypeBean |
代理模式(Proxy) | 找人办事,增强职责 | ProxyFactoryBean、JdkDynamicAopProxy、CglibAopProxy |
委派模式(Delegate) | 干活算你的(普通员工),功劳算我的(项目经理)。 | DispatcherServlet、BeanDefinitionParserDelegate |
策略模式(Strategy) | 用户选择,结果统一 | InstantiationStrategy |
模板模式(Template) | 流程标准化,自己实现定制。 | JdbcTemplate、HttpServlet |
适配器模式(Adapter) | 兼容转换头。 | AdvisorAdapter、HandlerAdapter |
装饰器模式(Decorator) | 包装,同宗同源 | BufferReader、InputStream、OutputStream、HttpHeadResponseDecorator |
观察者模式(Observer) | 任务完成时通知 | ContextLoaderListener |
Spring中的编程思想总结
Spring思想 | 应用场景(特点) | 一句话归纳 |
|---|---|---|
OOP | Object Oriented Programming(面向对象编程)用程序归纳总结生活中一切事物 | 封装、继承、多态 |
BOP | Bean Oriented Programming(面向Bean编程)面向Bean(普通的java类)设计程序,解放程序员 | 一切从Bean开始 |
AOP | Aspect Oriented Programming(面向切面编程)找出多个类中一定规律的代码,开发时拆开,运行时再合并。面向切面编程,及面向规则编程 | 解耦,专人做专事 |
IOC | Inversion of Controller(控制反转)将new对象的动作交给Spring管理,并由Spring保存已创建的对象(IOC容器) | 转交控制权(即控制权反转) |
DI/DL | Dependency injection(依赖注入)或者Dependency Lookup(依赖查找)依赖注入、依赖查找,Spring不仅保存自己创建的对象,而且保存对象与对象之间的关系.注入即赋值,主要三种方式构造方法、set方法、直接赋值 | 赋值 |
AOP在Spring中的应用
SpringAOP是一种变成范式,主要目的是将非功能性需求从功能性需求中分离出来,达到解耦的目的。主要应用场景有:Authentication(权限认证)、Auto Caching(自动缓存处理)、Error Handling(统一错误处理)、Debugging(调试信息输出)、Logging(日志记录)、Transactions(事物处理)。