开闭原则Open Closed Principle (OCP)是面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段。对于扩展是开放的,对于修改是关闭的,这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。模块的二进制可执行版本,无论是可链接的库、DLL或者.EXE文件,都无需改动。
参考http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html 依赖注入那些事.
下边如果添加武器装备, 那要多下边的代码进行加入修改,这样就违背了开闭原则,对扩展开放,对修改关闭. 通过武器接口, 分类武器继承实现, 可以更容易实现扩展和不做修改.
public void Attack(Monster monster) { if (monster.HP <= 0) { Console.WriteLine("此怪物已死"); return; } if ("WoodSword" == this.WeaponTag) { monster.HP -= 20; if (monster.HP <= 0) { Console.WriteLine("攻击成功!怪物" + monster.Name + "已死亡"); } else { Console.WriteLine("攻击成功!怪物" + monster.Name + "损失20HP"); } } else if ("IronSword" == this.WeaponTag) { monster.HP -= 50; if (monster.HP <= 0) { Console.WriteLine("攻击成功!怪物" + monster.Name + "已死亡"); } else { Console.WriteLine("攻击成功!怪物" + monster.Name + "损失50HP"); } } else if ("MagicSword" == this.WeaponTag) { Int32 loss = (_random.NextDouble() < 0.5) ? 100 : 200; monster.HP -= loss; if (200 == loss) { Console.WriteLine("出现暴击!!!"); } if (monster.HP <= 0) { Console.WriteLine("攻击成功!怪物" + monster.Name + "已死亡"); } else { Console.WriteLine("攻击成功!怪物" + monster.Name + "损失" + loss + "HP"); } } else { Console.WriteLine("角色手里没有武器,无法攻击!"); } } } }