head first (一):策略模式

时间:2023-12-26 15:30:01

head first 看了一遍,被面试时问我工厂模式,我发现我还是不记得,所以还是认认真真的看一遍吧,上一遍看的太快了,什么都没有记住。这一遍我会写下一些东西帮助自己记忆和理解,例子我也会用C#自己写一遍,所以感觉不错哦。

1:定义

策略模式:定义算法族,分别封装起来,让他们之间可以相互替换。

设计原则: 找到可能变化之处,把它们独立出来。

     针对接口编程,而不是针对实现编程

     多用组合,少用继承,行为是组合来的,而不是继承来的。

2:代码实现

C#源代码

鸭子飞的接口和动作实现

   public interface IFly
{
void fly();
}
    public class FlyWithWings : IFly
{
public void fly()
{
Console.WriteLine("I'm flying!!");
}
} public class FlyNoWay : IFly
{
public void fly()
{
Console.WriteLine("I cannot fly!!");
}
}

鸭子叫的接口和实现

   public interface IQuack
{
void quack();
}
//有声
public class Quack : IQuack
{
public void quack()
{
Console.WriteLine("Quack");
}
} //无声
public class MuteQuack : IQuack
{
public void quack()
{
Console.WriteLine("<< Silence>>");
}
} //吱吱声
public class Squeak : IQuack
{
public void quack()
{
Console.WriteLine("Squeak");
}
}

鸭子超类

public abstract class Duck
{
public IFly flyBehavior;
public IQuack quackBehavior;
public void performQuack()
{
quackBehavior.quack();
} public void performFly()
{
flyBehavior.fly();
} public void setFly(IFly flybehavior)
{
flyBehavior = flybehavior;
} public void setQuack(IQuack quackbehavior)
{
quackBehavior = quackbehavior;
} public void swim()
{
Console.WriteLine("all can swim");
} public abstract void display(); }

模型鸭子,继承鸭子

    public class ModelDuck : Duck
{
public ModelDuck()
{
flyBehavior = new FlyWithWings();
quackBehavior = new Squeak();
}
public override void display()
{
Console.WriteLine("I'm a model duck");
}
}

使用模型鸭子

            Duck model = new ModelDuck();
model.performFly();
model.performQuack();
model.setFly(new FlyNoWay());
model.performFly();
model.performQuack();

输出结果

head first (一):策略模式