#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();