您的位置:首页 > 编程语言 > C#

策略模式(StragetyPattern)学习记录

2016-01-12 10:24 357 查看
策略模式定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

本章提到三个设计原则:

一:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

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

三:多用组合少用继承。

首先我们来看最重要的超类。

public abstract class Duck
{
//抽象出飞行行为
public IFlyBehavior flyBehavior;
//抽象出叫的行为
public IQuackBehavior quackBehavior;

public abstract void display();

public void performQuack()
{
quackBehavior.quack();//委托给行为类
}
public void performFly()
{
flyBehavior.fly();//委托给行为类
}
public void swim()
{
Console.WriteLine("All ducks float,event decoys!");
}
public void setFlyBehavior(IFlyBehavior fb)
{
flyBehavior = fb;//可以动态设置行为(方便扩展)
}
public void setQuackBehavior(IQuackBehavior qb)
{
quackBehavior = qb;
}
}


仔细观察该类。飞和叫的行为被抽象出来了,因为并不是所有的鸭子都是会飞和会叫的。这就符合了设计原则的第一条,把可变的抽象出来。也是策略模式最重要的核心。抽象出可变的行为,交给perform来实现。而接口中只要定义叫和飞的行为就好。

接下来我们看看如何实现。定义一个绿头鸭,继承鸭子的超类。

public class MallardDuck:Duck
{
public MallardDuck()
{
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}

public override void display()
{
Console.WriteLine("I'm a real Mallard duck");
}
}


很简单只要在构造函数中实现飞和叫的行为就好了。

接下来调用验证

Duck mallard = new MallardDuck();
mallard.display();
mallard.performQuack();
mallard.performFly();


对就是这么简单,就实现绿头鸭的功能了。

细心的人会发现在超鸭类中还有两个函数setFlyBehavior和setFlyBehavior两个方法,这两个方法是干什么用的呢,从代码上就可以看出是要动态设置飞行行为和叫的行为的。应用场景呢就是比如一个模型鸭是不会飞的,现在呢需要给模型鸭装上火箭动力。怎么办呢,其实这就用到动态设置鸭子行为的方法了。

首先我们先添加一个模型鸭类跟绿头鸭是一样的。

public ModelDuck()
{
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}

public override void display()
{
Console.WriteLine("I'm a model duck");
}


然后添加一个火箭动力的飞行行为

public class FlyRocketPowered:IFlyBehavior
{
public void fly()
{
Console.WriteLine("I'm flying with a rocket!");
}
}


接下来调用模型鸭

Duck model = new ModelDuck();
model.display();
model.performQuack();
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();


重点就是setFlyBehavior方法,动态给模型鸭添加了火箭动力。

好了,策略模式就是这么多,重点也全部体现在超类Duck中。

第一次写这种类型的文章,哪里有不懂的欢迎留言问我。

也可以加群169767436私聊群主要源码。大家一起讨论学习,一起进步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  策略模式-C#