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

原创 2016年05月31日 19:20:56


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


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 !!!
      //今天 我们将揭开 我们这个模式的神秘面纱: 他的名字叫做:策略模式!!

           




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






        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

软件设计模式-曾梦想仗剑走天涯

故纸堆里翻出来的收藏博文,稍作整理转载以作备忘。 -------------------------------------------------------------- 活用...

第二篇 设计模式--工厂方法模式

定义:工厂模式是我们软件设计最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。 好处:在创建一类对象时,使用工厂模式,给系统带来更大的可扩展性可更少的修改量 代码: package f...

第二篇、创建型设计模式——工厂方法模式

前言:从最开始接触编程,到一点点有了些心得体会,到迫切的希望写出漂亮的代码,总会有意识的去寻找途径。当开始接触设计模式的时候,会发现,种种设计模式之间很难区分,甚至觉得极为类似。有时候也会在几种模式之...

设计模式第二篇-单例设计模式

1.单例设计模式定义:确保某一个类只有一个实例,而且自行实例化并且向整个系统提供这个实例。实现代理模式主要有以下几点:(1) 构造函数不对外开放,一般为private;(2) 通过一个静态方法或者枚举...

IOS设计模式第二篇之单例设计模式

文章to 现在我们的组件已经有组织了。你需要从其他的地方得到数据,你也可以创建一个API类管理数据这个下个设计模式单例里面介绍。 这个单例设计模式确保这个类仅仅拥有一个实例,并且为这个实例提供一个...

第二篇博文《“设计模式”的内涵,以及具体设计模式适用问题的隐喻》

我以前觉得自己很聪明,在公司写软件的时候也这么觉得。但是当我作为一名自由职业者写软件的时候,觉得自己很笨,脑子不够用,掉进泥窝里面,怎么也不爬出来。真的 在对客户改变或者增加功能,而我很难甚至无法修改...

设计模式——介绍与工厂模式(扁平管理模式VS职业经理人模式)

本文主要对设计模式进行大概讲解,特别是对创建型设计模式进行简明的解析:    一、设计模式的分类 三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结...

Android编程思想,面向对象程序设计第二篇——单例模式

上一节讲了面向对象程序设计的6个原则,这一节我们开始讲设计模式中的单例模式。单例模式顾名思义就是一个实例,就是从头到尾就只会同时存在一个实例。从第一次调用这个类的初始化方法而诞生到整个Applicat...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)