设计模式之策略模式
2016-11-29 19:05
253 查看
我慢慢的开始对于一些概念给出我自己的定义,而不是去搬一些“标准”或“书”,因为一个是当我发现我之前写的博客凡是“抄”过书上的到现在我仍然需要查之外,还有一个原因是我也慢慢开始找到自己学习的方法。所以如果我的定义和概念和标准不一样,请您批判着看。另外需要注意评论,我后面很可能补充一些东西或者纠正一些东西。
如果你能想到可以定义一个鸭子的父类,将公共属性集合到一起,那么很好,你已经有面向对象的基本思想了,我们可以这么干:
这样还行,各个鸭子继承
但是有两个问题:
1:假设我们的20只鸭子有18只都是白色羽毛的,我们就需要在这18个子类中都实现一遍白色羽毛的
2:我们现在需要给鸭子增加一个飞的功能,功能很简单,就是“飞”和“不能飞”,首先我们需要改Duck中方法,增加飞的函数,其次我们还是需要实现两个版本的多份“飞功能”的代码在不同的子类中,这明显已经重复了。
面向对象设计的原则:
1:能少些代码就少写代码
2:将系统中变化的拿出来分析,不变的固定。
当然,这是我自己胡说的。
对于上面遇到的这个问题,我们可以这么干。
代码如下:
Duck.java
flybehavior.java
flywithswing.java
flynoway.java
greenduck.java
main.java
执行结果如下:
2:如果添加新功能(Eat),我们再次实现相应接口(EatBehavior),将它包含进Duck类中就行。
总结:是不是感觉就是用接口实现了,那这种模式和直接把接口定义在外边让子类实现接口的区别呢?还是代码复用的问题,策略模式代码只用一份,用接口实现的话需要将代码在实现接口的类中都实现。
缺点等以后遇到别的在比较着补充吧。
一:策略模式
对于同一个功能的不同实现(比如鸭子的“叫声”有“呱呱叫”还有“嘎嘎叫”),将他们分别用不同的类实现。二: 什么意思?
举个栗子,我们想做一个“鸭子”的系统,用来表示世界上所有的鸭子,鸭子基本上都会游泳;鸭子有的会飞,有的不会飞;有的嘎嘎叫,有的呱呱叫;有的羽毛是白色,有的羽毛是黑色……如果你能想到可以定义一个鸭子的父类,将公共属性集合到一起,那么很好,你已经有面向对象的基本思想了,我们可以这么干:
abstract class Duck { swim(); { //实现 }; //游泳 abstract quack(); //叫的方法不一样,让鸭子各自实现 abstract display(); //每个鸭子羽毛颜色不一样,各自实现 }
这样还行,各个鸭子继承
Duck父类,实现自己的
quack()方法和
display()方法就行了。
但是有两个问题:
1:假设我们的20只鸭子有18只都是白色羽毛的,我们就需要在这18个子类中都实现一遍白色羽毛的
display()方法,虽然它们都是一样的代码,呼~,听起来任务量是有点大,但是你还是必须写。
2:我们现在需要给鸭子增加一个飞的功能,功能很简单,就是“飞”和“不能飞”,首先我们需要改Duck中方法,增加飞的函数,其次我们还是需要实现两个版本的多份“飞功能”的代码在不同的子类中,这明显已经重复了。
面向对象设计的原则:
1:能少些代码就少写代码
2:将系统中变化的拿出来分析,不变的固定。
当然,这是我自己胡说的。
对于上面遇到的这个问题,我们可以这么干。
三:使用策略模式
将代码复用,面向接口编程。将方法的实现独立出来。如下所示:代码如下:
Duck.java
public abstract class Duck { public flybehavior flybehavior; public void performfly() { flybehavior.fly(); } public abstract void display(); }
flybehavior.java
public interface flybehavior { public void fly(); }
flywithswing.java
public class flywithswing implements flybehavior { public void fly() { System.out.println("I am flying with swings"); } }
flynoway.java
public class flynoway implements flybehavior { public void fly() { System.out.println("I can't fly"); } }
greenduck.java
public class greenduck extends Duck { public greenduck() { flybehavior = new flywithswing(); //实现飞行方式为翅膀飞行 } public void display() { System.out.println("I am display green"); } }
main.java
public class main { public static void main(String[] args) { Duck gdk = new greenduck(); gdk.performfly(); gdk.display(); } }
执行结果如下:
四:说说好处
1:实现了代码的复用,对于原来需要在每个类中重复写的方法现在不用了,只需要在实现接口的类中就可以。2:如果添加新功能(Eat),我们再次实现相应接口(EatBehavior),将它包含进Duck类中就行。
总结:是不是感觉就是用接口实现了,那这种模式和直接把接口定义在外边让子类实现接口的区别呢?还是代码复用的问题,策略模式代码只用一份,用接口实现的话需要将代码在实现接口的类中都实现。
缺点等以后遇到别的在比较着补充吧。
相关文章推荐
- 设计模式之Strategy(策略)
- 设计模式之策略模式(strategy)--游戏角色使用武器
- [设计模式] 23.Strategy 策略模式
- [★] .NET 偶尔连接的设计策略 -联机状态- 脱机模式- 数据同步
- 设计模式袖珍版 连续转载之 - Strategy(策略)
- 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)
- 设计模式随笔系列:鸭子-策略模式(Strategy)[原]
- 设计模式之Strategy(策略)
- 设计模式之策略模式探讨初步[引]
- 设计模式随笔系列:鸭子-策略模式(Strategy)[转]
- 设计模式之Strategy(策略)
- Java设计模式学习之一---策略模式
- AspectJ实现设计模式(二)——策略模式
- 设计模式之策略模式探讨初步
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式与泡mm的关系之strategy策略模式及再思考
- 设计模式之Strategy(策略)
- 设计模式随笔系列:鸭子-策略模式(Strategy)
- 设计模式(20)-策略模式(Strategy)