我慢慢的开始对于一些概念给出我自己的定义,而不是去搬一些“标准”或“书”,因为一个是当我发现我之前写的博客凡是“抄”过书上的到现在我仍然需要查之外,还有一个原因是我也慢慢开始找到自己学习的方法。所以如果我的定义和概念和标准不一样,请您批判着看。另外需要注意评论,我后面很可能补充一些东西或者纠正一些东西。
一:策略模式
对于同一个功能的不同实现(比如鸭子的“叫声”有“呱呱叫”还有“嘎嘎叫”),将他们分别用不同的类实现。
二: 什么意思?
举个栗子,我们想做一个“鸭子”的系统,用来表示世界上所有的鸭子,鸭子基本上都会游泳;鸭子有的会飞,有的不会飞;有的嘎嘎叫,有的呱呱叫;有的羽毛是白色,有的羽毛是黑色……
如果你能想到可以定义一个鸭子的父类,将公共属性集合到一起,那么很好,你已经有面向对象的基本思想了,我们可以这么干:
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类中就行。
总结:是不是感觉就是用接口实现了,那这种模式和直接把接口定义在外边让子类实现接口的区别呢?还是代码复用的问题,策略模式代码只用一份,用接口实现的话需要将代码在实现接口的类中都实现。
缺点等以后遇到别的在比较着补充吧。