目的:提高代码的复用性,拓展性,降低代码间的耦合度。
示例:就以鸭子举例
1.将类之间的共性定义在父类之中。
鸭子都会游泳
public abstract class Duck { public void swim(){ System.out.println("游泳!"); } }
2.将子类一定有的功能(不同子类实现方式不一样)写成抽象方法在父类中。
不同鸭子颜色不一样
public abstract class Duck { public void swim(){ System.out.println("游泳!"); } abstract void showColor(); }
3.将子类不一定有的方法单独写成接口。
比如不是所有鸭子都会飞(比喻不太恰当,理解含义就行)
public interface QuackBehavior { void quack(); } public interface JumpBehavior { void jump(); }
4.将步骤3中的接口作为成员属性放在父类中。
数据摆放顺序是按照步骤摆的,为了方便理解,实际读者在写代码的时候不要写这种顺序。
public abstract class Duck { public void swim(){ System.out.println("游泳!"); } abstract void showColor(); FlyBehavior flyBehavior; JumpBehavior jumpBehavior; public void performFly(){ flyBehavior.fly(); } public void performJump(){ jumpBehavior.jump(); } }
5.针对独立出来的接口写具体的实现类。
public class FlyWithWing implements FlyBehavior { public void fly() { System.out.println("用翅膀飞!"); } } public class JumpWithOneLeg implements JumpBehavior { public void jump() { System.out.println("用一只脚跳!"); } }
6.创建我们需要的具体实现类,继承父类,在构造函数中指定需要功能的具体实例,实现特色功能。
public class RedDuck extends Duck{ public RedDuck(){ flyBehavior = new FlyWithWing();
jumpBehavior = new JumpWithOneLeg(); } public void showColor() { System.out.println("red!"); } }
7.测试demo
public class Test { public static void main(String...args){ Duck duck = new RedDuck(); duck.performFly();
duck.performJump(); duck.swim(); ((RedDuck) duck).showColor(); } }
1.假设现在我们多了一个鸡的对象,可以直接将飞和跳的能力用上,因为这些行为是与鸭子解耦的。增加了代码的复用性。
2.假设现在多了一种行为,鸡会唱歌,那么我们完全可以写一个唱歌的行为,不会对目前已有的鸭子对象造成影响。
END