Java设计模式梳理

设计模式分类

Creational Patterns(创建型模式) Factory Method
Structural Patterns(结构型模式) Adapter,Decorator
Behavioral Patterns(行为类模式) Strategy,TemplateMethod,Iterator,Visitor

意义

使用设计模式的意义
可复用性
可维护性
可扩展性

设计模式更强调多个类/对象之间的关系和交互过程,比接口/类复用的粒度更大

decorator-装饰器模式-Structural Patterns

适用:为对象增加不同侧面的属性
为每一个特性构造子类,通过委派机制增加到对象上

比继承更灵活

装饰器模式同时使用了子类型和委托

Decorator既是继承,又是委托。在Decorator里的属性是接口类型的一个引用,构造函数中需要传入一个接口类型的对象,然后将属性里的引用指向这个对象。所以是聚合
在装饰类中,对需要的方法添加新的功能,然后基础的功能通过super()来调用。

Decorator	Inheritance

组合特性 运行时 编译时
对象数目 在运作时,会产生很多个互相合作的对象 只会产生一个特定类型的对象
组合难易 很容易,穿衣服 多重继承很难

adapter-适配器模式-Structural Patterns

将某个类/接口转换为Client期望的其他形式

通过增加一个接口,将已经存在的子类封装起来,client面向接口编程,从而隐藏了具体子类

目的:复用老组件,或称为包装

通过委托来实现的,在adapter中实例化adaptee的对象

注意这里adapter是实现了一个接口

strategy-策略模式-行为型模式

适用:有多种不同的算法实现同一个任务,但是需要client根据需要动态切换算法,而不是写死在代码里
为不同的实现算法构造抽象接口,利用委托,运行时动态传入client倾向的算法类实例
优点:
容易扩展新算法
将算法和用户代码隔离开

用户在调用某个方法时,将一个该接口类型的引用传入进去,这个接口类型的引用一定对应了一个实例化的具体算法类,这样就可以调用相应的算法类。

template-模板模式-行为型模式

在子类中,做事情的步骤一样,但是具体方法不同。将共性提升至超类型,将个性保留在子类型

注意在抽象类中要提供一个final修饰的方法,依次调用各步骤的方法

共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现

使用继承和重写实现模板模式
(Strategy使用了委托)

模板模式广泛的使用在框架frameworks中

不想让子类重写的方法在抽象类中用final修饰

iterator/iterable

客户端希望遍历被放入容器/集合类的一组ADT对象,无需关心容器的具体类型
不管对象被放进哪里,都应该提供同样的遍历方式

让自己的集合类实现Iterable接口,
并实现自己的独特Iterator迭代器(hasNext, next, remove),允许客户端利用这个迭代器进行显式或隐式的迭代遍历

想要迭代的集合类需要实现Iterable接口,并实现Iterator interator()方法,Iterator是一个接口,里面有三个方法,需要创造一个具体类,然后实现这三个方法。在Iterator interator()中,返回自己实现的这个具体类的对象

visitor

对特定类型的object的特定操作(visit),在运行时将二者动态绑定到一起,该操作可以灵活更改,无需更改被visit的类

本质上:将数据和作用于数据上的某种/特定操作分离开来

为ADT预留一个将来可扩展功能的“接入点”,外部实现的功能代码可以在不改变ADT本身的情况下通过delegation接入ADT
预留的扩展点就是accept(visitor),只需要让ADT接受visitor

在存在数据的对象如Collections类的对象中,当需要某种特定的访问类型时,可以在参数中传入一个Visitor类型的引用,允许他以某种特定的方式访问自己的数据。

如果将这个操作类型直接在ADT中实现的话,那么根据OCP,这个方法就难以改变和扩展
Iterator 以遍历的方式访问集合数据而无需暴露其内部表示,将“遍历”这项功能委托到外部实习
Visitor 在特定的ADT上执行某种操作,但该操作不在ADT内部实现,而是delegate到独立的visitor对象,客户端可以扩展/改变visitor的操作算法,而不影响ADT

共同点	区别

Visitor 都是通过委托建立动态联系。但是visitor强调外部定义对ADT的操作,与ADT关系不大。Strategy强调的是ADT中某些比较重要的算法 站在外部Client的角度,灵活添加对ADT的各种不同操作
Strategy 站在ADT内部的角度,灵活变化对不同功能的配置

factory method 工厂方法 Creational Patterns

又叫做虚拟构造器
使用场景

  1. 当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,使用工厂方法

使用方法
定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。

使用工厂方法,当有一个新的具体产品类需要加入时,可以在工厂类里修改或增加新的工厂函数。而不会影响客户端代码。

Client使用“工厂方法”来创建实例,得到实例的类是抽象接口而非具体类

工厂方法的两种实现形式:

  1. 在ADT内部实现
  2. 构造单独的工厂类。

优点

  1. 减少客户端代码对于具体类的依赖,创建时只需要调用接口中的工厂方法即可
  2. 客户端代码获得的实例是接口类型,所以在工厂类中可以将其实例化为任何一个已经被定义的具体类
    缺点
  3. 客户可能需要创建一个子类来获得一个具体的产品(因为用户无法接触工厂方法中实例化的类型)

总结:工厂类是一个接口。他的子类决定实例化哪一个类。当我们使用工厂类中创建具体类的函数时,我们得到的实例类型是一个接口,因为这里的实例化可能是多种的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值