策略模式[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 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, nullnull));
            
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>

 

posted @ 2010-01-16 23:07  小白.net  阅读(269)  评论(0编辑  收藏  举报