设计模式之策略模式

策略模式(Strategy)

一、定义

定义一些列算法类,将每一个算法封装起来,并且让他们可以互相替换。策略模式让算法独立于使用它的客户而变化。

二、结构

Context(环境类):负责使用算法策略,其中维持了一个抽象策略类的引用实例

Strategy(策略接口类):所有策略类的父类(接口),为所支持的策略算法声明了抽象方法

ConcreteStrategy(具体策略类):实现了在抽象策略中声明的方法

三、优点

提供了对开闭原则的完美支持,用户可以在不修改原有系统的基础上选择具体算法或行为,也可以灵活地增加新的算法或行为

避免了多重if-else条件选择语句,利于系统的维护

提供了一种算法的复用机制,不同的环境类可以方便地复用这些策略类

四、缺点

客户端需要知道所有的策略类,并自行决定使用哪一个策略(使用者必须知道每一个策略类其中的算法)

将造成系统产生很多的具体策略类,任何细小的变化都将导致系统要增加一个具体策略类(策略越多,类越多)

无法在客户端同时使用多个策略类(一次只能使用一种策略)

五、应用场景

如果一个系统要动态地在几种算法之间选择其中一种

如果有难以维护的多重if-else条件语句是为了实现对象的行为

不希望客户知道复杂的于算法有关的数据结构,可以将其封装到策略中

六、个人总结

1、从面向过程角度来说

很多时候,我们需要判断各种条件后然后执行不同的业务罗技

而且执行业务逻辑非常的复杂,我们可以看做一个个复杂的算法(策略)

我们可以将其进行拆分一个个策略类来实现,从而方便维护,方便复用

2、从面向对象角度来说

2.1如果使用继承

如果父亲不是抽象方法,那么容易导致忘记或者遗漏重写方法

如果抽象方法,那么每个类都必须要去重写父类的方法,无论你需不需要(有时候你是不需要的)

而且有可能大多数的代码相同时,改动就变得很复杂了

2.2如果使用多个接口实现

那么如果使用策略A就需要修改为接口A,如果使用策略B就需要修改为接口B

比较麻烦,而且接口多,代码复用性就变差了

策略模式使用组合(在类增加一个私有域,引用另一个已有类的实例,通过调用引用实例的方法从而获得新的功能)

足够的灵活,更加易于维护,策略可以复用

posted @ 2020-03-19 22:27  尐海爸爸  阅读(125)  评论(0编辑  收藏  举报