//注意 以下代码均是讲解的最终版本,详细讲解内容,请关注直播
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 !!!
//今天 我们将揭开 我们这个模式的神秘面纱: 他的名字叫做:策略模式!!
//我们不能根据需求动态的创造,现在我们需要动态更加有弹性
//要追求就追求到极致
}
}
}