总则:设计模式的意义是为你提供智慧,并支持你的设计过程,而不是取而代之。
策略模式(Strategy Pattern)
定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
以下内容高手请跳过,会浪费您时间的。
代码下载:http://download.csdn.net/detail/josslin025/6879621 (资源分0,绝不欺诈)
解压后DuckTest文件夹根目录下的 DuckTest.sln 是VS2012项目,Backup文件夹里是VS2008项目
上面的定义理论性强了点,下面从代码切入:
Duck抽象类:鸭子有游泳、叫、飞的行为
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplicationStaticClass
{
publicabstractclassDuck
{
protectedFlyBehavior flyBehavior;//为接口类型声明引用变量,在派生类中再实例化
protectedQuackBehavior quackBehavior;//为接口类型声明引用变量,在派生类中再实例化
public Duck()
{ }
publicvoid performFly()
{
flyBehavior.fly();
}
publicvoid performQuack()
{
quackBehavior.quack();
}
publicvoid swim()
{
Console.WriteLine("所有的都会游泳");
}
publicvoid setFlyBehavior(FlyBehavior fb)
{
flyBehavior = fb;
}
publicvoid setQuackBehavior(QuackBehavior qb)
{
quackBehavior = qb;
}
}
}
FlyBehavior 接口和实现该接口的类:有的鸭子不能飞,模型鸭;玩具鸭子被改造了,装上了推动装置(推动火箭),能飞了。
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplicationStaticClass
{
public interfaceFlyBehavior
{
void fly();
}
publicclassFlyWithWings : FlyBehavior
{
publicvoid fly()
{
Console.WriteLine("我能飞...");
}
}
publicclassFlyNoWay : FlyBehavior
{
publicvoid fly()
{
Console.WriteLine("我不能飞...");
}
}
publicclassFlyRecketPowered : FlyBehavior
{
publicvoid fly()
{
Console.WriteLine("我是火箭,当然能飞...");
}
}
}
QuackBehavior接口和实现该接口的类:动物的鸭子会嘎嘎叫;模型鸭不会叫;按压玩具鸭,它的发生装置会发出“唧唧”的声音。
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplicationStaticClass
{
publicinterfaceQuackBehavior
{
void quack();
}
publicclassQuack : QuackBehavior
{
publicvoid quack()
{
Console.WriteLine("嘎嘎叫...");
}
}
publicclassMuteQuack : QuackBehavior
{
publicvoid quack()
{
Console.WriteLine("不会叫...");
}
}
publicclassSquack : QuackBehavior
{
publicvoid quack()
{
Console.WriteLine("唧唧叫...");
}
}
}
MallardDuck类:具体的类,野鸭子
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplicationStaticClass
{
public classMallardDuck:Duck
{
public MallardDuck()
{
quackBehavior =newQuack();
flyBehavior = newFlyWithWings();
}
publicvoid display()
{
Console.WriteLine("是只真正的野鸭子");
}
}
}
ModelDuck类:具体的类,模型鸭
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplicationStaticClass
{
public classModelDuck:Duck
{
public ModelDuck()
{
flyBehavior = newFlyNoWay();
quackBehavior =newMuteQuack();
}
publicvoid display()
{
Console.WriteLine("是模型,不能飞。。。");
}
}
}
测试代码
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplicationStaticClass
{
classMiniDuckSimulator
{
publicstaticvoid Main(string[] args)
{
Duck mallard =newMallardDuck();
mallard.performFly();
mallard.performQuack();
Duck model =newModelDuck();
model.performQuack();
model.performFly();
model.setFlyBehavior(newFlyRecketPowered());
model.performFly();
Console.ReadKey();
}
}
}
关键的设计在于对鸭子行为(飞和叫的多种可能性)的封装。
亲,看明白了吗?
不明白的话,可以自己下载以上代码研究(0分的资源分哦)
下载地址:http://download.csdn.net/detail/josslin025/6879621