使用面向对象的思想 用c#控制台代码模拟猫抓老鼠
我们先来分析一下猫抓老鼠的过程
1.猫叫了
2.所有老鼠听到叫声,知道是哪只猫来了
3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠xxx"
一 双向耦合的代码
首先需要一个猫类Cat 一个老鼠类Rat 和一个测试类Program
老鼠类的代码如下
//老鼠类
public classRat
{public string Name { get; set; } //老鼠的名字
public Cat MyCat { get; set; } //老鼠遇到的猫//老鼠逃跑的方法
public voidRun()
{
Console.WriteLine(MyCat.Name+
"猫来了,大家快跑!!我是" +Name);//打印出信息 包含了猫的名字和老鼠本身的名字
}//带参和无参构造
publicRat() { }public Rat(stringname, Cat cat)
{this.Name =name;this.MyCat =cat;
}
}
要让猫叫的时候依次打印出老鼠的逃跑方法,需要在Cat类里添加一个存放Rat对象的集合
Cat类的代码如下
public classCat
{public string Name { get; set; } //猫的名字
List list = new List(); //存放Rat对象的集合//为集合增加老鼠
public voidAdd(Rat rat)
{
list.Add(rat);
}//移除
public voidRemove(Rat rat)
{
list.Remove(rat);
}//猫叫的方法
public voidShout()
{
Console.WriteLine("喵喵喵!");//如果集合非空,循环执行每只老鼠的Run()方法
if (list != null)
{foreach (Rat item inlist)
{
item.Run();
}
}
}publicCat() { }public Cat(stringname)
{this.Name =name;
}
}
在Main方法中,我们需要构建几个Rat对象和一个Cat对象,将Rat对象添加到Cat对象的集合中,调用Cat对象的Shout方法
代码如下
static void Main(string[] args)
{//构建一个Cat对象和两个Rat对象 老鼠遇到的猫是构建的cat
Cat cat = new Cat("Tom");
Rat rat1= new Rat("Jerry", cat);
Rat rat2= new Rat("TaoQi", cat);//调用猫类的Add方法添加老鼠对象
cat.Add(rat1);
cat.Add(rat2);//调用猫的Shout方法
cat.Shout();
Console.ReadKey();
}
运行结果如下
这样的代码缺陷很明显,Cat类和Rat类紧密耦合
猫可能不止要抓老鼠 还要抓小鸟
当然不止是猫会抓 也可能狗拿耗子多管闲事
于是我们可以把猫和狗提出来 继承自一个抽象类Pet
抓捕的小动物老鼠和小鸟没有什么关系 但是都能(逃)跑
先不去管小鸟是飞,我们把它们称作 可以跑的 都实现一个IRunable接口
二 观察者 模式(发布-订阅模式)
修改后的代码如下
新增抽象类Pet ,猫类继承自Pet (猫类的代码变化不大 略去不写
public abstract classPet
{