C#设计模式之策略模式

来源:互联网 发布:linux高性能服务器 pdf 编辑:程序博客网 时间:2024/06/03 11:34

一、策略模式简介:

      1.定义

         策略模式属于对象的行为模式。其用意是针对一组算法,将这一组中的每一个算法封装到具有共同接口的独立的类中,从而使他们可以互相替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

 2.使用场景

 有时候针对一个对象,其行为可能是不变的,也可能是在不断改变的,针对不同情况就要有不同的表现形式。对于这些容易变化的行为,我们应该灵活运用,而不是将行为绑定在对象中,最好的状态就是可以动态的进行改变。简言之,策略模式就是为了应对对象中复杂多变的行为而产生的。

二、策略模式的结构:

              策略模式是对算法的包装,是把调用的算法的责任(行为)和算法本身(行为实现)分割开来,委派给不同的对象管理。简单来说就是 准备一组算法,把每一个算法都封装起来,使得他们可以互换。

         这个模式有三个角色:

         对象:复杂多变的对象。

         接口。

         封装了相关的算法和行为。

三、具体场景实现:

假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。


  根据描述,折扣是根据以下的几个算法中的一个进行的:


  算法一:对初级会员没有折扣。


  算法二:对中级会员提供10%的促销折扣。


  算法三:对高级会员提供20%的促销折扣。



1.接口类,用来连接对象和类中封装的方法(算法)

public interface MemberStrategy    {        /**        * 计算图书的价格        * param booksPrice    图书的原价        * return    计算出打折后的价格        */        double calcPrice(double booksPrice);  //接口的方法和属性都是公共的,就没有必要留下“public”修饰符了    }
2.封装一系列方法的类

(1)初级会员

public class PrimaryMemberStrategy : MemberStrategy    {        public double calcPrice(double booksPrice)        {            Console.WriteLine("对于初级会员的没有折扣.");            return booksPrice;        }    }
(2)中级会员

public double calcPrice(double booksPrice)        {            Console.WriteLine("对于中级会员的折扣为10%");            return booksPrice * 0.9;        }
(3)高级会员

public double calcPrice(double booksPrice)        {            Console.WriteLine("对于高级会员的折扣是20%");            return booksPrice * 0.8;        }
3.价格类

public class Price    {        private MemberStrategy strategy;        /**         * 构造函数,传入一个具体的策略对象         * @param strategy    具体的策略对象         */        public Price(MemberStrategy strategy)        {            this.strategy = strategy;        }        public double quote(double booksPrice)        {            return this.strategy.calcPrice(booksPrice);        }    }

4.具体实现

static void Main(string[] args)        {            MemberStrategy strategy = new AdvancedMemberStrategy();//实例化一个高级会员类的对象            Price price = new Price(strategy);            double quote = price.quote(300);            Console.WriteLine("图书的最终价格是:"+quote);            Console.ReadKey();        }





原创粉丝点击