当前位置:编程学习 > C#/ASP.NET >>

设计模式之行为型模式三

行为型模式:
 
策略模式
    它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
 
简单工厂模式的不足:
    由于工厂本身包括了所有的收费方式,商场是可能经常性的更改打折额度和返利额度,每次维护或扩展收费方法都要改动这个工厂,以致代码需重新编译部署,很麻烦
 
方法:
         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# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,