设计模式一:策略模式
目的:提高代码的复用性,拓展性,降低代码间的耦合度。
示例:就以鸭子举例
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

浙公网安备 33010602011771号