上图来自于Love667767的博客用图

(1)策略模式通常把一系列的算法(算法等于常说的类中的方法,在这里称之为算法)包装到一系列的策略类里面。用一句话慨括策略模式就是——“将每个算法封装到不同的策略类中,使得它们可以互换”。比如说在继承关系中,子类重写算法,这就实现互换,

(2)示例:现在有不同的角色和不同的武器,每个角色只能使用一个武器,但是可以在游戏中换武器。

实现:

Charactor(角色)是抽象类,是由具体的角色来继承,具体的角色有King,Queen,Knight,Troll(妖怪),Weapon(武器)是接口,由具体的武器继承,所有的角色和武器都是具体类,任何角色想要换武器,可以调用setWeapon()方法,在打斗(fight)中,会调用到目前武器的useWeapon()方法,攻击其他角色。

(3)可以根据上图编辑代码

角色:

 public abstract class Character
    {
        WeaponBehavior weapon;//上图的UML图中这个类和WeaponBehavior有关联箭头,在这里进行关联。
        //virtual表示可以被子类override
        public virtual void fight()
        {

            Console.WriteLine("战斗!!!");
        }
        /// <summary>
        /// 更换武器的方法。
        /// </summary>
        /// <param name="w"></param>
        public virtual  void setWeapon(WeaponBehavior w)
        {
            this.weapon = w;
        
        }

    }

国王:

  public class King:Character
    {
       //继承父类的算法,可以不用在子类重复,要改变的话加override进行重写。
        public void wq(WeaponBehavior w)
        {
            w.useWeapon();
        }
        public King()
        { }
    
    }

武器接口:

public   interface WeaponBehavior
    {
     void useWeapon();


    }

铁剑与匕首实例:

   public class SwordBehavior : WeaponBehavior
    {

        public void useWeapon() 
        {
            Console.WriteLine("使用铁剑");
        
        }
    
    }
    public class KnifeBehavior : WeaponBehavior
    {

        public void useWeapon()
        {
            Console.WriteLine("使用匕首");

        }

    }

测试类:


    public class Test
    {

        public static void Main(String[] args)
        {
            WeaponBehavior wb = new SwordBehavior();
            
            King c = new King();
            c.fight();
            //使用铁剑
            c.wq(new SwordBehavior());
            //使用匕首
            c.wq(new KnifeBehavior());
        }
    
    }

 

 

 

 

 

 

 

 

 


本文转载:CSDN博客