设计模式-策略模式

2017-03-20  本文已影响3人  时待吾

比如在一个系统中,所有对系统的操作都要有日志记录,而且这个日志还需要有管理界面,这种情况下通常会把日志记录在数据库里面,方便后续的管理,但是在记录日志到数据库的时候,可能会发生错误,比如暂时连不上数据库了,那就先记录在文件里面,然后在合适的时候把文件中的记录再转录到数据库中。

对于这样的功能的设计,就可以采用策略模式,把日志记录到数据库和日志记录到文件当作两种记录日志的策略,然后在运行期间根据需要进行动态的切换。

单一职责原则(SRP),就一个类而言应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,这种耦合会导致脆弱的设计当变化发生时,设计会遭受到意想不到的破坏。

创建型模式:主要侧重于对象的创建过程;

结构型模式:主要侧重于处理类或对象的组合;

行为型模式:主要侧重于类或对象之间的交互以及职责分配。

首先了解下策略模式的概念:定义了多个算法,并将它们封装起来(一般的是每个算法封装成一个单独的类),让算法独立于客户端而可以单独变化。

应用场景:

1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

针对同一命令(或行为),不同的策略做不同的动作。

具体可以看一下下面的例子(以计算加、减、乘为例):

1. 对加、减、乘每个算各自封装成一个类,首先定义其共同的接口:

1interfaceICalculator{23publicintcalculator(inta,intb);45}

2. 分别定义加、减、乘算法类:

1classPlusimplementsICalculator {23@Override4publicintcalculator(inta,intb) {5returna +b;6}78}

1classMinusimplementsICalculator {23@Override4publicintcalculator(inta,intb) {5returna -b;6}78}

1classMultiplyimplementsICalculator {23@Override4publicintcalculator(inta,intb) {5returna *b;6}78}

3. 定义上下文环境类,用于封装各个算法类操作:

1classContext{23privateICalculator iCalculator;45publicContext(ICalculator iCalculator){6this.iCalculator =iCalculator;7}89publicintcalculator(inta,intb){10returniCalculator.calculator(a, b);11}1213}

4. 测试:

1publicclassStrategyTest {23publicstaticvoidmain(String[] args) {4Context context =newContext(newPlus());5context.calculator(2, 3);6}78}

上一篇下一篇

猜你喜欢

热点阅读