Strategy Pattern

问题:

设计一种子类继承超类的模式

原方案:

public class Duck
{
    void quack(){}
    void swim(){}
    void display(){}
    void fly(){}
}
public class MallardDuck : Duck
{
    void display(){}
}
public class RedheadDuck : Duck
{
    void display(){}
}
public class RubberDuck : Duck
{

}

问题:

这样一来, 在接下去 可能要添加的类中 不得不继承超类的所有行为, 如果有需要定义子类自己行为的, 不得不为所有需要定义的类去覆盖

所以:

将类中有变化的部分抽取出来, 跟其他不太变化的分离开来


public interface FlyBehavior
{
    void fly();
}
public class FlyWay1 : FlyBehavior
{
    void fly(){}
}
public class FlyWay2 : FlyBehavior
{
    void fly(){}
}
public class FlyNoWay : FlyBehavior
{
    void fly(){}
}

 

 

public abstract class Duck
{
    FlyBehavior flyBehavior;
    void quack(){}
    void swim(){}
    void display(){}
    void fly(){
        flyBehavior.fly();
    }
}
public class MallardDuck : Duck
{
    FlyBehavior flyBehavior;

    public RedheadDuck(){
        flyBehavior = new FlyWay1();
    }

    void display(){}
}
public class RedheadDuck : Duck
{
    FlyBehavior flyBehavior;

    public RedheadDuck(){
        flyBehavior = new FlyWay2();
    }

    void display(){}
}
public class RubberDuck : Duck
{
    FlyBehavior flyBehavior;

    public RedheadDuck(){
        flyBehavior = new FlyNoWay();
    }

    void display(){}
}

结论:

封装变化

多用组合, 少用继承

针对接口编程

 

posted @ 2015-12-09 23:36  `Laimic  阅读(107)  评论(0)    收藏  举报