#region 车辆接口和实现 interface IVehicle { void Run(); } class Car : IVehicle { public void Run() { Console.WriteLine("Car is Running"); } } class Truck : IVehicle { public void Run() { Console.WriteLine("Truck is Running"); } } #endregion
驾驶员类:函数
class Driver { private IVehicle _vehicle; public Driver(IVehicle vehicle) { _vehicle = vehicle; } public void Drive() { _vehicle.Run(); } }
服务调用方:spa
var driver = new Driver(new Car());//开汽车 driver = new Driver(new Truck());//开卡车 driver.Drive(); //这时候你会发现,若是小女生想要开坦克的话,目前是知足不了的 //由于Driver构造参数传递的是IVehicle接口,不是ITank接口 //若是想要知足小女生开坦克上街的愿望,就必须改造Driver,传递ITank接口,请看下一个例子 Console.ReadKey();
第二版的实现=》小女生能开坦克,可是却不能开汽车了设计
class Driver { private ITank _tank; public Driver(ITank tank) { _tank = tank; } public void Drive() { _tank.Run(); } }
var driver = new Driver(new HeavyTank());//开坦克 driver.Drive(); // 这时候你会发现, 小女生能开坦克上街了,可是你又会发现,小女生如今只会开坦克了,不会开车了 // 问题出如今哪里呢? // 咱们把一个胖接口(ITank)传递进来,这个胖接口中有一个咱们永远用不到的功能,就是fire。 // 因此如今这个设计是违反了接口隔离原则 // 具体改造请看下一个例子 Console.ReadKey();
#region 车辆接口和实现 interface IVehicle { void Run(); } class Car : IVehicle { public void Run() { Console.WriteLine("Car is Running"); } } class Truck : IVehicle { public void Run() { Console.WriteLine("Truck is Running"); } } #endregion
interface IWeapon { void Fire(); }
interface ITank:IVehicle,IWeapon { } class LightTank : ITank { public void Fire() { Console.WriteLine("Boom!"); } public void Run() { Console.WriteLine("Ka Ka Ka!"); } } class HeavyTank : ITank { public void Fire() { Console.WriteLine("Boom!!!!!!!!"); } public void Run() { Console.WriteLine("Ka!!! Ka!!!! Ka!!!!!!"); } }
驾驶员类:3d
class Driver { private IVehicle _vehicle; public Driver(IVehicle vehicle) { _vehicle = vehicle; } public void Drive() { _vehicle.Run(); } }
服务调用方:code
//接口隔离的原则是 服务的调用方不会都要 //本例子中服务的调用方的需求很简单,这是要求会run,不要求fire //所以原先的ITank接口中本身包含的fire和run就符合胖接口的规则,他提供了多余的接口给调用方 //所以把ITank接口隔离开是对的 var driver = new Driver(new HeavyTank());//开坦克 driver.Drive(); driver = new Driver(new Car());//开汽车 driver.Drive(); Console.ReadKey();