策略模式
学习策略模式的时候看到这篇文章感觉不错,这里记录下,作者使用了角色的技能来讲解,其实在游戏里面,我想这种应该是用枚举来实现的,一个骑士可以用任何武器,灵活的应用吧,可能他这里是为了讲解策略模式。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JackYong.Strategy.Solution
{
    public enum UserSkill
    {
        Sword,
        Axe,
        Nothing,
        Weapon
    }
}
策略模式代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace JackYong.Strategy.Solution
{
    #region 封装 UseWeapon() 行为
    // 定义使用 武器接口
    public interface IWeaponable
    {
        void UseWeapon();
    }
    // 使用 剑 的类
    public class UseSword : IWeaponable
    {
        public void UseWeapon()
        {
            Console.WriteLine("Action: Sword Armed. There is a sharp sword in my hands now.");
        }
    }
    // 使用 斧 的类
    public class UseAxe : IWeaponable
    {
        public void UseWeapon()
        {
            Console.WriteLine("Action: Axe Armed. There is a heavy axe in my hands now.");
        }
    }
    // 不能使用武器的类
    public class UseNothing : IWeaponable
    {
        public void UseWeapon()
        {
            Console.WriteLine("Speak: I can't use any weapon.");
        }
    }
    #endregion
    #region 定义角色类
    // 角色基类
    public abstract class Character
    {
        protected IWeaponable WeaponBehavior;      // 通过此接口调用实际的 UseWeapon方法。
        // 使用武器,通过接口来调用方法
        public void UseWeapon()
        {
            WeaponBehavior.UseWeapon();
        }
        // 动态地给角色更换武器
        public void ChangeWeapon(IWeaponable newWeapon)
        {
            Console.WriteLine("Haha, I've got a new equip.");
            WeaponBehavior = newWeapon;
        }
        public void Walk()
        {
            Console.WriteLine("I'm start to walk ...");
        }
        public void Stop()
        {
            Console.WriteLine("I'm stopped.");
        }
        public abstract void DisplayInfo(); // 显示角色信息
    }
    // 定义野蛮人
    public class Barbarian : Character
    {
        public Barbarian()
        {
            // 初始化继承自基类的WeaponBehavior变量
            WeaponBehavior = new UseAxe();  // 野蛮人用斧
        }
        public override void DisplayInfo()
        {
            Console.WriteLine("Display: I'm a Barbarian from northeast.");
        }
    }
    // 定义圣骑士
    public class Paladin : Character
    {
        public Paladin()
        {
            WeaponBehavior = new UseSword();
        }
        public override void DisplayInfo()
        {
            Console.WriteLine("Display: I'm a paladin ready to sacrifice.");
        }
    }
    // 定义法师
    public class Wizard : Character
    {
        public Wizard()
        {
            WeaponBehavior = new UseNothing();
        }
        public override void DisplayInfo()
        {
            Console.WriteLine("Display: I'm a Wizard using powerful magic.");
        }
    }
    #endregion
    // 测试程序
    class Program
    {
        static void Main(string[] args)
        {
            Character barbarian = new Barbarian(); // 默认情况下野蛮人用斧
            barbarian.DisplayInfo();
            barbarian.Walk();
            barbarian.Stop();
            barbarian.UseWeapon();
            barbarian.ChangeWeapon(new UseSword());   // 现在也可以使用剑
            barbarian.UseWeapon();
            barbarian.ChangeWeapon(new UseNothing());// 也可以让他什么都用不了,当然一不会这样:)
            barbarian.UseWeapon();
        }
    }
}
出处:http://www.cnblogs.com/liuyong/
作者喜欢研究 Sql Server ,ASP.NET MVC , Jquery WCF 等技术,同时关心分布式架构的设计应用。转载请保留原文链接,谢谢! 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号