• 设计模式之策略设计模式


    一、何为策略设计模式呢?

      在我的理解中,策略模式是尽量使用组合而非继承来实现一个行为,对一个方法的进行封装来使用,在组合类中进行调用时能够随时改变这一方法的运行时的内容。下面让我们来看看将一个实现改成策略模式后的便捷性。  

    二、一个简单的示例

      假设我们有一个抽象的人,他拥有会踢球跟会乐器的技能,然后有一个只会踢球不会乐器的人继承了这个抽象的人类,还有一个只会乐器不会踢球的人继承了这个抽象的人类。

     1     abstract class People{
     2         abstract void playBall();
     3         abstract void playInstrument();
     4     }
     5     
     6     /**
     7      * 一个只会乐器的人 9      *
    10      */
    11     class InstrumentPeople extends People{
    12 
    13         @Override
    14         void playBall() {
    15             
    16         }
    17 
    18         @Override
    19         void playInstrument() {
    20             System.out.println(" I can play piano");
    21         }
    22         
    23     }
    24     
    25     /**
    26      * 一个只会打球的人28      *
    29      */
    30     class PysicalPeople extends People{
    31 
    32         @Override
    33         void playBall() {
    34             System.out.println("I can play basketBall");
    35         }
    36 
    37         @Override
    38         void playInstrument() {
    39             
    40         }
    41         
    42     }

      在继承的模式中我们只能必须实现那个不能完成的方法,那个方法已然成为了一个冗余的空壳方法。

    当我们把实现的方式改成策略设计模式

         /**
         * 一个只会打球的人
         *
         */
        class PysicalPeople{
            private PlayBall playBall;
    
            public void setPlayBall(PlayBall playBall) {
                this.playBall = playBall;
            }
            
            public void playBall(){
                this.playBall.play();
            }
            
        }
        
        /**
         * 一个只会乐器的人
         *
         */
        class InstrumentPeople{
            
            private PlayInstrument playInstrument;
    
            public void setPlayInstrument(PlayInstrument playInstrument) {
                this.playInstrument = playInstrument;
            }
    
            public void palyInstrument(){
                this.playInstrument.play();
            }
            
        }
        
        interface PlayBall{
            void play();
        }
        
        class PlayBasketBall implements PlayBall{
    
            public void play() {
                System.out.println("I can play basketball");    
            }
            
        }
        
        interface PlayInstrument{
            void play();
        }
        
        class PlayPiano implements PlayInstrument{
    
            public void play() {
                System.out.println("I can play piano");
        }
            

       我们在策略模式中将方法表现为一个类,在不同的人类中通过组合来实现不同的技能,实现方式改为策略设计模式之后,我们可以很容易的让一个类去拥有某一个方法,而不会存在冗余的方法。当我们需要需要PysicalPeople会踢足球时,只需要继承playBall接口实现一个PlayFootBal类,通过setPlayBall方法将PlayFootBall对象设置到PysicalPeople中就可以很方便的实现方法内部的实现,而不用修改类内部的代码。

      策略设计模式也体现了面向设计模式的一个原则:多用组合,少用继承。

  • 相关阅读:
    使用 CSS 强制内容不换行
    奇怪的 Object reference not set to an instance of an object
    (String) 和 String.valueOf() 两种字符串转换的区别
    SQL 里面的 UNION 说明
    Flex/AIR 中 Embed 标签的使用
    把 doc、xls、pdf 转换为 swf 的相关工具
    把指定的站点加到 IE 可信站点中
    在 VS 中快速打开文件或类型
    linux配置网卡
    linux配置本地源
  • 原文地址:https://www.cnblogs.com/huangweikun/p/6358512.html
Copyright © 2020-2023  润新知