策略模式[strategy pattern]
[策略模式]
定义算法家族,分别封装起来,让他们之间可以互相替换
此模式可以让算法的变化不影响到使用算法的客户
[OO原则之一]
封装变化
多用组合,少用继承
针对接口编程,不针对实现编程
//代码来自 head first java(可惜不是C#,但是代码差不多)
//注释均为个人见解
//飞行接口
public interface IFlyBehavior
{
void fly();
}
//具体的飞行动作--普通飞,就算是其他的类(本例为鸭子),也可以使用它
public class flywithWings : IFlyBehavior
{
public void fly()
{
Console.WriteLine("i can normal fly");
}
}
//具体的飞行动作--用用火箭助推器
public class flywithRoket : IFlyBehavior
{
public void fly()
{
Console.WriteLine("I fly with rocketPower");
}
}
//鸭子抽象类
public abstract class duck
{
//一个飞行接口对象
public IFlyBehavior flybehavior;
//关键!!利用多态实现飞行动作
public void fly()
{
flybehavior.fly();
}
//这个方法可以改变飞行的动作
public void setFlyBeh(IFlyBehavior fb)
{
flybehavior = fb;
}
//鸭子都有不同的外表
public abstract void display();
//鸭子都会游泳
public void swiming()
{
Console.WriteLine("all duck can swim");
}
}
//一个鸭子实例
public class whtduck : duck
{
//初始化得时候定义了它如何飞
public whtduck()
{
flybehavior = new flywithWings();
}
public override void display()
{
Console.WriteLine("我的黄皮肤的中国鸭");
}
}
class Program
{
//测试
static void Main(string[] args)
{
duck d = new whtduck();
d.fly();
d.setFlyBeh(new flywithRoket());
d.fly();
Console.Read();
}
}
//飞行接口
public interface IFlyBehavior
{
void fly();
}
//具体的飞行动作--普通飞,就算是其他的类(本例为鸭子),也可以使用它
public class flywithWings : IFlyBehavior
{
public void fly()
{
Console.WriteLine("i can normal fly");
}
}
//具体的飞行动作--用用火箭助推器
public class flywithRoket : IFlyBehavior
{
public void fly()
{
Console.WriteLine("I fly with rocketPower");
}
}
//鸭子抽象类
public abstract class duck
{
//一个飞行接口对象
public IFlyBehavior flybehavior;
//关键!!利用多态实现飞行动作
public void fly()
{
flybehavior.fly();
}
//这个方法可以改变飞行的动作
public void setFlyBeh(IFlyBehavior fb)
{
flybehavior = fb;
}
//鸭子都有不同的外表
public abstract void display();
//鸭子都会游泳
public void swiming()
{
Console.WriteLine("all duck can swim");
}
}
//一个鸭子实例
public class whtduck : duck
{
//初始化得时候定义了它如何飞
public whtduck()
{
flybehavior = new flywithWings();
}
public override void display()
{
Console.WriteLine("我的黄皮肤的中国鸭");
}
}
class Program
{
//测试
static void Main(string[] args)
{
duck d = new whtduck();
d.fly();
d.setFlyBeh(new flywithRoket());
d.fly();
Console.Read();
}
}
//代码来自大话设计模式(并且省略了一部分)
//注释是为个人见解
//交钱接口
public interface Ijiaoqian
{
double acceptCash(double money);
}
//普通缴费
class Normal : Ijiaoqian
{
public double acceptCash(double money)
{
return money;
}
}
//打折缴费
class dazhe : Ijiaoqian
{
private double MoneyRebate = 1d;
public dazhe(string moneyRebate)
{
this.MoneyRebate = double.Parse(moneyRebate);
}
public double acceptCash(double money)
{
return money * MoneyRebate;
}
}
class strategy
{
private Ijiaoqian jq;
//设置策略
public void setModel(Ijiaoqian jq)
{
this.jq = jq;
}
//调用设置后的缴费方式
public double retResult(double moneny)
{
return jq.acceptCash(moneny);
}
}
class Program
{
static void Main(string[] args)
{
//原代码把缴费选项存在一个XML文件里如下,通过数据绑定到dropdownlist
//加上反射,这样就可以只需要修改XML文件,既达到目的
//给实例化类的构造函数参数
object[] arg = new string[] { "0.8" };
strategy s = new strategy();
s.setModel((Ijiaoqian)Assembly.Load("mychengxuji").CreateInstance("WhtNamespace.dazhe", false, BindingFlags.Default, null, arg, null, null));
double d = s.retResult(10);
Console.WriteLine(d);
Console.Read();
}
}
// <CashAcceptType>
// <type>
// <name>正常收费</name>
// <class>CashNormal</class>
// <para></para>
// </type>
// <type>
// <name>满300返100</name>
// <class>CashReturn</class>
// <para>300,100</para>
// </type>
// <type>
// <name>满200返50</name>
// <class>CashReturn</class>
// <para>200,50</para>
// </type>
// <type>
// <name>打8折</name>
// <class>CashRebate</class>
// <para>0.8</para>
// </type>
// <type>
// <name>打7折</name>
// <class>CashRebate</class>
// <para>0.7</para>
// </type>
//</CashAcceptType>
//交钱接口
public interface Ijiaoqian
{
double acceptCash(double money);
}
//普通缴费
class Normal : Ijiaoqian
{
public double acceptCash(double money)
{
return money;
}
}
//打折缴费
class dazhe : Ijiaoqian
{
private double MoneyRebate = 1d;
public dazhe(string moneyRebate)
{
this.MoneyRebate = double.Parse(moneyRebate);
}
public double acceptCash(double money)
{
return money * MoneyRebate;
}
}
class strategy
{
private Ijiaoqian jq;
//设置策略
public void setModel(Ijiaoqian jq)
{
this.jq = jq;
}
//调用设置后的缴费方式
public double retResult(double moneny)
{
return jq.acceptCash(moneny);
}
}
class Program
{
static void Main(string[] args)
{
//原代码把缴费选项存在一个XML文件里如下,通过数据绑定到dropdownlist
//加上反射,这样就可以只需要修改XML文件,既达到目的
//给实例化类的构造函数参数
object[] arg = new string[] { "0.8" };
strategy s = new strategy();
s.setModel((Ijiaoqian)Assembly.Load("mychengxuji").CreateInstance("WhtNamespace.dazhe", false, BindingFlags.Default, null, arg, null, null));
double d = s.retResult(10);
Console.WriteLine(d);
Console.Read();
}
}
// <CashAcceptType>
// <type>
// <name>正常收费</name>
// <class>CashNormal</class>
// <para></para>
// </type>
// <type>
// <name>满300返100</name>
// <class>CashReturn</class>
// <para>300,100</para>
// </type>
// <type>
// <name>满200返50</name>
// <class>CashReturn</class>
// <para>200,50</para>
// </type>
// <type>
// <name>打8折</name>
// <class>CashRebate</class>
// <para>0.8</para>
// </type>
// <type>
// <name>打7折</name>
// <class>CashRebate</class>
// <para>0.7</para>
// </type>
//</CashAcceptType>