设计模式之策略设计模式

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

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

二、一个简单的示例

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

 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中就可以很方便的实现方法内部的实现,而不用修改类内部的代码。

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值