您的位置:首页 > 其它

设计模式之策略模式

2016-11-29 19:05 253 查看
我慢慢的开始对于一些概念给出我自己的定义,而不是去搬一些“标准”或“书”,因为一个是当我发现我之前写的博客凡是“抄”过书上的到现在我仍然需要查之外,还有一个原因是我也慢慢开始找到自己学习的方法。所以如果我的定义和概念和标准不一样,请您批判着看。另外需要注意评论,我后面很可能补充一些东西或者纠正一些东西。

一:策略模式

对于同一个功能的不同实现(比如鸭子的“叫声”有“呱呱叫”还有“嘎嘎叫”),将他们分别用不同的类实现。

二: 什么意思?

举个栗子,我们想做一个“鸭子”的系统,用来表示世界上所有的鸭子,鸭子基本上都会游泳;鸭子有的会飞,有的不会飞;有的嘎嘎叫,有的呱呱叫;有的羽毛是白色,有的羽毛是黑色……

如果你能想到可以定义一个鸭子的父类,将公共属性集合到一起,那么很好,你已经有面向对象的基本思想了,我们可以这么干:

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类中就行。

总结:是不是感觉就是用接口实现了,那这种模式和直接把接口定义在外边让子类实现接口的区别呢?还是代码复用的问题,策略模式代码只用一份,用接口实现的话需要将代码在实现接口的类中都实现。

缺点等以后遇到别的在比较着补充吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: