设计模式一:策略模式

目的:提高代码的复用性,拓展性,降低代码间的耦合度。

示例:就以鸭子举例

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

posted @ 2019-03-20 23:29  lastcy  阅读(106)  评论(0编辑  收藏  举报