读Head First设计模式 - 1

一个公司有一款游戏,鸭子(有很多种类的鸭子)可以有不同的外观(display函数表示),也可以游泳(swim函数表示),有些鸭子可以飞(fly函数表示)。

方法一:基类Duck定义display,swim,fly三个函数,所有鸭子继承Duck。问题:如果某种鸭子没有fly行为,需要在该类中重写fly函数,fly(){},麻烦...

方法二:定义接口Flyable,只要拥有fly功能的鸭子就实现这个接口。问题:代码无法重用,飞行行为可能有很多种,每次都要自己实现。

设计原则1:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。

设计原则2:针对接口编程,不要针对实现编程。

前面的两种做法,第一种行为来自Duck超类的具体实现,第二种做法继承某个接口并由之类自行实现而来。这两种做法都是依赖于“实现”。

我们的设计:定义FlyBehavior的接口,接口中提供fly函数,所有某种特定的fly行为都作为一个类实现FlyBehavior这个接口,比如:FlyWithWings、FlyNoWay等。

public interface FlyBehavior{
    public void fly();
}
public class FlyWithWings implements FlyBehavior{
    public void fly(){
        System.out.println("I'm flying!");
    }
}
public class MallardDuck extends Duck{
    FlyBehavior _flyBehavior;
    public MallardDuck(){
        _flyBehavior = new FlyWithWings();
    }
    public void performFly(){
        _flyBehavior.fly();
    }
}

我们发现,在我们的构造函数中,我们还是在针对实现编程,以后会修正...

设计原则3:多用组合,少用继承。

良好的OO设计必须具备可复用,可扩充,可维护三个特性。

你可能感兴趣的:(读Head First设计模式 - 1)