设计模式之策略模式和状态模式

举报
chenyu 发表于 2021/07/27 00:02:50 2021/07/27
1.1k+ 0 0
【摘要】 1 策略模式 我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法, 我们可以简单理解为更加不同的策略对象,执行不同策略方法。                 2 类图   ...

1 策略模式

我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法,

我们可以简单理解为更加不同的策略对象,执行不同策略方法。

2 类图

3 代码实现

1)接口:Strategy.java


      public interface Strategy {
        public int doOperation(int num1, int num2);
      }
  
 

 2)实现类:OperationAdd.java


      public class OperationAdd implements Strategy{
        @Override
        public int doOperation(int num1, int num2) {
      return num1 + num2;
         }
      }
  
 

3)实现类:OperationSubstract.java


      public class OperationSubstract implements Strategy{
        @Override
        public int doOperation(int num1, int num2) {
      return num1 - num2;
         }
      }
  
 

4)实现类:OperationMultiply.java


      public class OperationMultiply implements Strategy{
        @Override
        public int doOperation(int num1, int num2) {
      return num1 * num2;
         }
      }
  
 

5)创建Context.java


      public class Context {
        private Strategy strategy;
        public Context(Strategy strategy){
      this.strategy = strategy;
         }
        public int executeStrategy(int num1, int num2){
      return strategy.doOperation(num1, num2);
         }
      }
  
 

StrategyPatternDemo 里面的main函数


      public class StrategyPatternDemo {
        public static void main(String[] args) {
       Context context = new Context(new OperationAdd());
       System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
       context = new Context(new OperationSubstract());
       System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
       context = new Context(new OperationMultiply());
       System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
         }
      }
  
 

 

4 运行结果


      10 + 5 = 15
      10 - 5 = 5
      10 * 5 = 50
  
 

5 对比状态模式

我们上面策略模式里面的Demo里面每次都是通过传递新的策略对象来构建Context对象,那我们的状态模式可以理解为我们在Context类里面有单独设置策略对象的函数,不需要每次进行构建Context,状态模式是通过状态转移来改变 Context 所组合的 State 对象,而策略模式是通过 Context本身的决策来改变组合的 Strategy 对象

6 代码实现

我们把上面的Context里面的构造方法里面不要单独进行传递策略对象,我们单独增加一个SetStrategy这样的函数来设置策略改变当前类的策略对象具体的属性值。

Context.java


      public class Context {
        private Strategy strategy;
        public Context(){
         }
        public SetStrategy(Strategy strategy){
      this.strategy = strategy;
         }
        public int executeStrategy(int num1, int num2){
      return strategy.doOperation(num1, num2);
         }
      }
  
 

      public static void main(String[] args) {
       Context context = new Context();
       context.SetStrategy(new OperationAdd());
       System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
       context.SetStrategy(new OperationSubstract());
       System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
       context.SetStrategy(new OperationMultiply());
       System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
      }
  
 

部分内容参考链接:https://www.runoob.com/design-pattern/state-pattern.html

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

原文链接:chenyu.blog.csdn.net/article/details/103556216

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

作者其他文章

评论(0

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

    全部回复

    上滑加载中

    设置昵称

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

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

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