设计模式很多中,但是也非常容易忘记什么情况下使用。
本文初步理解的设计模式,结合现实中的使用,方便形成印象,是初学者的思维理解。
-
模板模式
可以简单理解为,定义一个主方法流程,里面调用一系列方法不实现,由各个子类实现这一系列方法。其中主方法,不能由子类重写 -
装饰器模式
可以认为是一个封装类wrap,内部封装一个核心类,几乎实现和和核心类一样的功能。如在开发中常用的,把一些三方模块再次封装,变成调用自己的类。这样有个好处是,隔离三方api的一些变化,由封装类去统一处理,三方变化对整个app影响小。 -
适配器模式
适配器模式,可以认为是对不同类的对象的再次封装成一个类型,如实现某个接口/协议,这样不同的类,就可以统一当做一个新的类型使用。开发中,有的时候经常可以用来给不同的类增强一些功能。 -
享元模式
可以认为是创造出一个对象,然后在很多地方持有并使用这个对象的一些能力/api。同样这个对象的功能比较基础,通用和强大。如在每个模块中由某个对象对外提供一些统一的api,这个对象可以采用采用享元模式。把对象注入到一个容器中,然后每个模块,想用的时候从该容器中去用搞对象。然后调用他的方法。一些依赖注入的框架就是这样操作的。注意取用的时候转换成想要的类型,这样才能调用相关api。 -
外观模式
外观模式,相当于由一个类统一对外提供一些功能。也常用于一个模块对外提供api接口 -
代理模式
就是一个对象不实现一些功能由代理实现,或者是调用代理做某些事情,或者是从代理获得某些需要的资源 -
观察者模式
可以看做是发布者和订阅者的这个关系,发布者持有很多订阅者。使用方调用发布者的方法,发布者内部遍历所有订阅者,通知他们。 -
桥接模式
通常用于解决多个维度都有变化的问题,把有一个变化的维度抽象,并在另外的地方实现。然后这个类注入这个抽象的依赖。比如分享场景,有不同的渠道,也有不同的内容。在一个类中实现逻辑很繁琐,可以把不同的内容在其他地方实现,和不同的渠道在其他类中实现,桥接类持有他们,然后实现分享。 -
中介者
中介者,可以直接想象成路由模块,是一个通信中枢,避免模块间相互通信。中介者通过出入的参数解析,调用到其他模块的类,进行跳转。通常是被调用方在中介者注册一系列操作,每个操作有一个名称和相关参数。调用方传入操作名称和参数。中介者通过操作名称找到这个方法,传入相关参数并调用。 -
状态模式
比如一个贴片机可以工作在两种模式(状态)下,分为大料状态和小料状态, 贴片机(上下文)的动作就是抓料,然后贴片。通过给上下文切换不同的状态,上下文的动作执行自动执行了状态的一些操作。看起来上下文好像是做了干了两个类的事情。 -
备忘录模式
可以理解成必须要备忘的状态在外面找地方存储一个,然后需要恢复的时候从外面取这个状态,并设置成这个状态。比如修改昵称,等有些地方需要重置等等。 -
组合模式
可以想到就是树的结构,一棵树由节点和叶子组成。通过访问一个根节点,可以访问到所有的子节点和叶子。省市县,这种数据可以使用这种模式 -
迭代器模式
就是使集合和遍历功能分离,遍历使用单独的迭代器进行(do while循环)。迭代器实现hasNext()和next()方法。 -
责任链
就是构建一系列链结构,前一个节点发现不能处理的事务交给后一个节点处理。通常节点需要含有nextHandler属性和hanlder()方法。这个模式非常适合处理一些谁的孩子谁抱走的问题。如处理一个消息可能需要不同的处理类去处理,就可以使用。或者一些授权大小的问题。它的本质是寻找一个响应者能够处理这个消息的响应者。 -
命令模式
针对一大堆操作,可以看作是命令,命令持有一个接收者。创建一堆命令(具体类),每条命令都有接受者执行命令。根据不同的命令,接受者执行不同的操作。调用方就是根据场景调用不同的命令执行,最终由接收者执行。 -
访问者模式
定义一个访问者,里面有不同的方法。被访问者执行一个方法,这个通过传入不同的访问者,最后执行访问者的方法。比如一个游乐场,分不同的票的游玩者,游乐场根据访问者(不同票的入场者),安排参观(参观路线由入场者的票上面的路线图指定)
网友评论