设计模式之行为型模式三
行为型模式:策略模式它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。简单工厂模式的不足:由于工厂本身包括了所有的收费方式,商场是可能经常性的更改打折额度和返利额度,每次维护或扩展收费方法都要改动这个工厂,以致代码需重新编译部署,很麻烦方法:1,定义一个所有支持的算法的公共接口2,将所有具体算法或行为封装在一起3,维护对公共接口的引用客户端代码是将所有的算法实例化这个模式涉及到三个角色:环境(Context)角色:持有一个Strategy类的引用。抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。具体策略(ConcreteStrategy)角色:包装了相关的算法或行为优点:使用策略模式可以把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则在具体策略类(ConcreteStrategy)中提供。由于算法和环境独立开来,算法的增减、修改都不会影响环境和客户端。当出现新的促销折扣或现有的折扣政策出现变化时,只需要实现新的策略类,并在客户端登记即可。策略模式相当于"可插入式(Pluggable)的算法"个人理解:策略模式与工厂模式工厂模式是将需要实例化的所有对象放到一个类中,然后在客户端直接使用工厂的方法,实现不同对象的不同操作策略模式是将工厂中的方法提取出来,然后将需要实例化的对象都放到了客户端去实例。当我需要添加不同的策略时,只在客户端添加它的实例即可,然后将对象作为参数传到策略模式中即可策略模式结构图:课本实例:商场打折代码如下:[csharp]class cashcontext{//基类类型的对像private CashSuper cs;//初始化时(构造函数),传入具体的对象public cashcontext(CashSuper csuper){this.cs = csuper;//将csuper赋给cs,然后计算cs对象的收到的现金数//通过传入参数的不同,计算不同方式的收到现金数}public double getresult(double money)//根据具体的策略对象,调用其算法的方法{return cs.acceptCash(money);}}备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.Memento模式比较适用于功能比较 复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态课本实例:游戏的状态保存代码如下:[csharp]//一个发起人类:有攻击力,生命力,还有创建备忘和恢复备忘的功能等class GameRole{//生命力private int vit;public int Vitality{get { return vit; }set { vit = value; }}//攻击力private int atk;public int Attack{get { return atk ; }set { atk = value; }}//防御类private int def;public int Defense{get { return def ; }set { def = value; }}//状态显示public void StateDisplay(){Console.WriteLine("角色当前状态:");Console.WriteLine("体力:{0}", this.vit);Console.WriteLine("攻击力:{0}", this.atk);Console.WriteLine("防御类:{0}", this.def);Console.WriteLine("");}//获得初始状态public void GetInitState(){this.vit = 100;this.atk = 100;  补充:软件开发 , C# ,
上一个:c#高性能编码三
下一个:C#窗体实现文件拖拽功能