设计模式连载:第二篇职业和武器模式,成就你的梦想

来源:互联网 发布:js 设置display block 编辑:程序博客网 时间:2024/05/23 11:45


//注意 以下代码均是讲解的最终版本,详细讲解内容,请关注直播 


using strategyone;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace strategyone
{


 //为什么叫职业和武器模式, 肯定都玩过网络游戏或者单机游戏 MMO这种的
//我个人喜欢玩: 战士  不是策划强行要求 ,战士的武器都是 剑 枪 棍 斧 (近战武器)
//弓箭手 的武器 都是 弓 或者是 弩, 如果这个游戏现代化点,那么就是枪炮 (远程武器)


// 我们现在是一个角色,   1. 战士(近战武器) 2 弓箭手(远程武器) 
//第一开始我们写的 角色,  角色里面有一个方法, 拿近战武器的方法,拿远程武器的方法 


  //战士 和 弓箭手都是 继承  角色的。 同时继承了他们的方法
  //   如果 写的比较烂,  那么 我们战士有可能会拿起弓 ,这了不得啊
   // 如果写的稍微烂, 那么   我们可以在 战士和弓箭手的类中实现 这个 拿各自武器的方法
   //但是随着需求增加, 我们会苦不堪言   
   //
   
   //所以我们现在有一种模式,  利用的继承的好处,抛弃的继承的包袱
   //  多态  是 有魔力的  真的很棒  


 //我们写代码 就要写有弹性的代码,越有弹性 越好, 利于我们后期的维护
        
 //我们今天讲的这个模式,就是 把变化的和不变的 分离开!! 这是关键之处
 //当我们写代码的时候,发现那些功能会不断的变化,那么我们果断给他从大团体里分离开 
 
       //现在我们来写几个类,通过案例就能发现其中的奥秘


        // 1 角色类,  2战士类 3 弓箭手类 
        //         




        // 我们现在把 角色这个类 给抽象 
public abstract/*抽象类型*/ class  character
    {


        //我们刚才不是写了一个 武器接口吗?


       public Raw_weapon raw_weapon; //(有奖竞猜)知道为啥我们要写这个东西吗?稍后告诉你们








        //增加一个方法


        public void set_weapon_change(Raw_weapon raw_weapon)
        {
            this.raw_weapon = raw_weapon;
        }




       //我们这个万恶的方法是不是就应该被淘汰掉了呢?
       public void Set_weapon()
        {
        raw_weapon.set_weapon_type();//(有奖竞猜)知道为啥我们要写这个东西吗?稍后告诉你们
        }
    






    } 
           
public class warrior:character
    {


        //写构造方法
        public warrior()
        {
            //我们思考一下, 战士需要拿剑,对吧,为了有弹性的代码,我们应该这样子写
            raw_weapon = new sword_weapon();  //心态准备爆炸!!!




        }


        public void des_job()
        {
            Console.WriteLine("我是战士,我总是冲在最前面!保护我的队友");
        }


      
  


    }


public class bowman:character
    {
        public void  des_job()
        {
            Console.WriteLine("我是弓箭手,我天生娇贵,没有办法怪我喽");
        }
        //写构造方法
        public bowman()
        {
            //我们思考一下, 战士需要拿剑,对吧,为了有弹性的代码,我们应该这样子写
            raw_weapon = new bow_weapon();  //心态准备爆炸!!!




        }




    }


  public class Asn:character
    {


        public void des_job()
        {
            Console.WriteLine("我是刺客,我喜欢各种阴人,阴人就是我最大的爱好");
        }




        //写构造方法
        public Asn()
        {
            //我们思考一下, 战士需要拿剑,对吧,为了有弹性的代码,我们应该这样子写
            raw_weapon = new Asn_weapon();  //心态准备爆炸!!!




        }






    }
















    //从上述案例,我们似乎发现了一个非常爆炸的消息
    //有些功能总是TMD在变化,烦死人了,每次都要动写好的代码,难过的不要不要的




    //我们的这个模式,就像上帝一样,帮我们消灭邪恶的人们,拯救我们脱离苦海
    //我们把变化的给从集体里面抽出来,给他关进小黑屋子,让他哼,大伙懂得
    //  我们发现,每当出一个新的职业,就需要新的武器, 
    //我们可以强行  告诉自己, 这武器,是万恶的源头!!!


    //要想写一个有 弹性 的代码,  关键字就是 弹性!!!  我们来思考一下,我们如写有弹性的代码


    //总结 1. 找出“活泼”的代码,把他们独立起来,不要和那些 “死气沉沉”的代码混在一起
    // 2 .针对“接口”编程,而不是针对“实现”编程
    //这样子就有利于我们写出 富有弹性的代码


    //根据上述原则, 我们写一个接口


    //接口什么内容呢?  武器的祖先(这个接口是所有武器类型的 祖先!)


    //武器的祖先(这个接口是所有武器类型的 祖先!)
       public interface Raw_weapon
    {
        void set_weapon_type();
       }
    //每个武器都写出一个具体的类  弓类, 剑类 冰火毒龙钻类, 魔杖类 
    public  class bow_weapon:Raw_weapon
    {
        public void set_weapon_type()
        {
            Console.WriteLine("我的名字叫做:神弓,谁拿了我,谁拥有了一支穿云箭");
            //throw new NotImplementedException();
        }


    }


    public class ice_weapon : Raw_weapon
    {
        public void set_weapon_type()
        {
            Console.WriteLine("我是冰火毒龙钻的大哥,我叫冰火两重天");
            //throw new NotImplementedException();
        }


    }






    public class Asn_weapon : Raw_weapon
    {
        public void set_weapon_type()
        {
            Console.WriteLine("我的名字叫做:冰火毒龙钻,谁敢嘲笑我?");
            //throw new NotImplementedException();
        }


    }


    public class sword_weapon : Raw_weapon
    {
        public void set_weapon_type()
        {
            Console.WriteLine("我已经拿到了上古传说的神剑");


            //throw new NotImplementedException();
        }


    }










    //我们有弓箭手, 弓, 战士,剑,刺客,冰火毒龙钻,法师,魔杖






    //每个武器都写出一个具体的类  弓类, 剑类 冰火毒龙钻类, 魔杖类       
    //这样子 我们就把变化的部分,全部独立了,




    //我们已经创建好了  角色类(所有职业的祖先了)  战士类,弓箭手类,魔法师类,刺客类 


















    class Program
    {
        static void Main(string[] args)
        {


            //战士  富有弹性的代码就这样子写出来了
            //现在我们就讲解一下 究竟发生了什么
           //// character c1 = new warrior();
           /// c1.Set_weapon();


           //// character c2 = new bowman();
         ///  c2.Set_weapon();






            character c3 = new Asn(); 
            c3.Set_weapon();
            //动态改变武器,真是酷炫到家了
            c3.set_weapon_change(new ice_weapon());
            //将冰火毒龙钻,变成冰火两重天、
            c3.Set_weapon();



      //这时 我们就 写出了 一个 极具富有弹性的代码,
      //让我们的后期维护以及前期开发变得轻松 so easy !!!
      //今天 我们将揭开 我们这个模式的神秘面纱: 他的名字叫做:策略模式!!

           




            //我们不能根据需求动态的创造,现在我们需要动态更加有弹性
            //要追求就追求到极致






        }
    }
}
1 0
原创粉丝点击