策略模式的定义:定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。独立于它的客户端 可以根据 自身选择 其中一种算法。
举些常用的 例子: 你去 旅行 ,完成这一事件 可能有 不同的交通工具的 选择 ,汽车,火车,飞机 都可以 看成 策略模式中的 一种算法 ,商场 活动 打折 ,针对 不同的 会员
等级 会有 不同 等级的 折扣 活动。每种折扣,也可以看成 一种 算法。电商 网站 中 经常 会举行 不同的 活动,可能会有 红包 ,现金,代金券,积分 等优惠活动 这也可以看成
一种策略算法。
策略模式 优点 在于 :子算法 之间 可以自由切换,子算法 具有 相同的 功能, (平等性),但可以 有不同的 实现。这样 可以把 代码 公共部分 放在 父类中,减少重复代码。
缺点: 事先必须知道 策略模式 拥有的子算法,在 对象初始化时,已经 确定好了 要执行的 算法。
1 namespace Strategy 2 { 3 4 //活动 抽象类 5 public abstract class MyStrategy 6 { 7 8 //活动抽象方法 9 10 public abstract void ActivityInterface(); 11 12 } 13 }
namespace Strategy { //红包活动 public class ActivityContentHongbao :MyStrategy { public override void ActivityInterface() { Console.WriteLine("红包方式活动"); } } // 积分活动 public class ActivityContentJiFen : MyStrategy { public override void ActivityInterface() { Console.WriteLine("积分方式活动"); } } //现金活动 public class ActivityContentMoneny : MyStrategy { public override void ActivityInterface() { Console.WriteLine("现金方式活动"); } } // 购物券活动 public class ActivityContentCoupon : MyStrategy { public override void ActivityInterface() { Console.WriteLine("购物券方式活动"); } }
namespace Strategy { /// <summary> /// 环境类 让使用者决定使用哪种活动方式 /// </summary> public class Context { public MyStrategy strategy; public Context(MyStrategy strategy) { //初始化时 传入具体的对象 你所要 选择的 活动方式 this.strategy = strategy; } //根据 你选择的策略 采用该策略 的具体 实现方法 public void ActivitycontentInterface() { strategy.ActivityInterface(); } } }
public class Program { public static void Main(string[] args) { Context activity; activity = new Context(new ActivityContentMoneny()); activity.ActivitycontentInterface(); Console.Read(); } }
遇到的问题:可访问性不一致 检查 有没有 方法 没有 用到 public 当你在一个访问性比较强(例如公共)的字段/属性/方法里使用自定义类型,而这个类型访问性比较低(例如保护/私有)的时候就发生这个问题了