设计模式之策略模式

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

一:策略模式

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

二: 什么意思?

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

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

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

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

缺点等以后遇到别的在比较着补充吧。

posted on 2016-11-29 19:05  杨博东的博客  阅读(25)  评论(0编辑  收藏  举报

导航