设计模式之策略模式(行为型)

举报
yd_273762914 发表于 2020/12/03 01:07:55 2020/12/03
【摘要】 一、模式定义 策略模式:定义一系列算法,然后将每一个算法封装起来,并将它们可以互相替换。也就是将一系列算法封装到一系列策略类里面。策略模式是一种对象行为型模式。策略模式符合“开闭原则“ Strategy Pattern: Define a family of algorithms, encapsulate each one, and make them int...

一、模式定义

策略模式:定义一系列算法,然后将每一个算法封装起来,并将它们可以互相替换。也就是将一系列算法封装到一系列策略类里面。策略模式是一种对象行为型模式。策略模式符合“开闭原则“

Strategy Pattern: Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

二、模式角色

  • Context :环境类
  • Strategy:抽象策略类
  • ConcreteStrategy:具体策略类

三、简单实例

不用策略模式的情况:

public class Context
{ …… public void method(String type) { ...... if(type == "strategyA") { //算法A } else if(type == "strategyB") { //算法B } else if(type == "strategyC") { //算法C } ...... } ……
} 


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

抽象策略类:

public abstract class AbstractStrategy
{ public abstract void method();  
} 


  
 
  • 1
  • 2
  • 3
  • 4
  • 5

具体策略类:

public class ConcreteStrategyA extends AbstractStrategy
{ public void method() { //算法A }
} 


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

环境类:

public class Context
{ private AbstractStrategy strategy; public void setStrategy(AbstractStrategy strategy) { this.strategy= strategy; } public void method() { strategy.method(); }
} 


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

客户端调用:

Context context = new Context();
AbstractStrategy strategy;
strategy = new ConcreteStrategyA();
context.setStrategy(strategy);
context.method();


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

四、策略模式和状态模式对比

相同点:

  • 策略模式和状态模式都是属于行为型设计模式,也同样是对象行为型设计模式,非类行为型设计模式。

  • 策略模式和状态模式有点类似,都符合”闭合原则“

  • 两个设计模式都可以用于减少代码大量的if…else

不同点:

  • 具体使用策略模式还是状态模式,可以通过环境类的状态而定,有很多状态的话,就使用状态模式。

  • 使用策略模式时,环境类需要选择一个确定的策略类,也就是客户端调时需要关心具体状态,根据需要调用;而状态模式是不需要的,在状态模式里,环境类是要放在一个具体状态中的,也就是根据环境类的状态改变进行调用状态类的算法

对状态模式不是很熟悉,可以参考我以前写的一篇博客
https://blog.csdn.net/u014427391/article/details/85219470

文章来源: smilenicky.blog.csdn.net,作者:smileNicky,版权归原作者所有,如需转载,请联系作者。

原文链接:smilenicky.blog.csdn.net/article/details/85542217

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。