面向对象的六大原则之 接口隔离原则——ISP
#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();
}
}
服务调用方:
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!!!!!!");
}
}
驾驶员类:
class Driver
{
private IVehicle _vehicle;
public Driver(IVehicle vehicle)
{
_vehicle = vehicle;
}
public void Drive()
{
_vehicle.Run();
}
}
服务调用方:
//接口隔离的原则是 服务的调用方不会都要
//本例子中服务的调用方的需求很简单,这是要求会run,不要求fire
//因此原先的ITank接口中自己包含的fire和run就符合胖接口的规则,他提供了多余的接口给调用方
//因此把ITank接口隔离开是对的
var driver = new Driver(new HeavyTank());//开坦克
driver.Drive();
driver = new Driver(new Car());//开汽车
driver.Drive(); Console.ReadKey();

面向对象的六大原则之 接口隔离原则——ISP的更多相关文章
- 设计原则:接口隔离原则(ISP)
接口隔离原则的英文是Interface Segregation Principle,缩写就是ISP.与里氏替换原则一样其定义同样有两种 定义1: Clients should not be force ...
- IOS设计模式的六大设计原则之接口隔离原则(ISP,Interface Segregation Principle)
定义 客户端不应该依赖它不需要的接口: 一个类对另一个类的依赖应该建立在最小的接口上. 定义解读 定义包含三层含义: 一个类对另一个类的依赖应该建立在最小的接口上: 一个接口代表一个角色,不应该将不同 ...
- 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP
前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(The Interface Segregation Principle). 英文原文:htt ...
- 设计模式 第一天 UML图,设计模式原则:开闭原则、依赖倒转原则、接口隔离原则、合成复用原则、迪米特法则,简单工厂模式
1 课程大纲 2 UML的概述 总结: UML unified model language 统一建模语言 一共有十种图: 类图 用例图 时序图 * 对象图 包图 组件图 部署图 协作图 状态图 (最 ...
- 最简单直接地理解Java软件设计原则之接口隔离原则
理论性知识 定义 接口隔离原则, Interface Segregation Principle,(ISP). 一个类对应一个类的依赖应该建立在最小的接口上: 建立单一接口,不要建立庞大臃肿的接口: ...
- 设计模式学习--面向对象的5条设计原则之接口隔离原则--ISP
一.ISP简介(ISP--Interface Segregation Principle): 使用多个专门的接口比使用单一的总接口要好.一个类对另外一个类的依赖性应当是建立在最小的接口上的.一个接口代 ...
- C# 实例解释面向对象编程中的接口隔离原则
在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...
- [设计模式]<<设计模式之禅>>关于接口隔离原则
在讲接口隔离原则之前,先明确一下我们的主角——接口.接口分为两种: ● 实例接口(Object Interface),在Java中声明一个类,然后用new关键字产生一个实例,它是对一个类型的事物的描述 ...
- 设计模式之六大原则——接口隔离原则(ISP)
设计模式之六大原则——接口隔离原则(ISP) 转载于:http://www.cnblogs.com/muzongyan/archive/2010/08/04/1792528.html 接口隔离原则 ...
随机推荐
- 1042. Flower Planting With No Adjacent
题意: 本题题意为: 寻找一个花园的涂色方案,要求 1.花园和花园之间,不能有路径连接的,不能涂成相同颜色的 一共有4中颜色,花园和花园之间,至多有三条路径 我菜了 - - ,又没做出来.. 看答案 ...
- 模板引擎Jinja2的基本用法
Flask提供的模板引擎为Jinja2,易于使用,功能强大.模板仅仅是文本文件,它可以生成任何基于文本的格式(HTML.XML.CSV.LaTex 等等). 它并没有特定的扩展名, .html 或 . ...
- toast文本提示信息元素获取
在做自动化的过程中,我们有可能会遇到toast提示语,这种提示语只会显示一两秒的样子,导致我们获取元素很困难 今天总结下怎么获取这个toast元素吧 例如下图所示的这种toast提示 图中红框的这种元 ...
- golang数据结构和算法之DoublyLinkedList双向链表
双向链表比起单向链表, 多了一个向前指向的指针, 所以在增删查改时,要同时照顾到两个指针的指向. DoublyLinkedList.go package DoublyLinkedList //双向链表 ...
- 浅谈JS的toString
任何一个对象都有toString()方法(默认继承自Object,自己可以重写),此方法返回一个字符串. var sayYo = function () { alert("sayYo2!&q ...
- Vue生命周期钩子---3
vue生命周期流程图:4张图 : 生命周期的解析和应用: Vue 实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom→渲染.更新→渲染.卸载等一系列过程,我们称这是 Vue ...
- conda基础命令
1.首先在所在系统中安装Anaconda.可以打开命令行输入conda -V检验是否安装以及当前conda的版本. 2.conda常用的命令. 1)conda list 查看安装了哪些包. 2)con ...
- 洛谷 P5595 【XR-4】歌唱比赛
洛谷 P5595 [XR-4]歌唱比赛 题目传送门 题目描述 小 X 参加了一场歌唱比赛. 经过一路鏖战,小 X 终于挺进了决赛,他的对手是小 Y. 这场歌唱比赛的冠军是由点赞数决定的,谁的点赞数高, ...
- ubuntu16.04matlab中文注释乱码的解决办法
中文注释乱码的原因是windows下的m文件采用的是gb2312编码,只要将所有的m文件转成 utf8文件,显示就正常了. 1.首先安装enca:sudo apt-get install enca 2 ...
- MySQL SQL DML (数据操作语言)
包括 SELECT, UPDATE, DELETE, INSERT SELECT 从数据库表中获取数据 用法 SELECT name FROM students; SELECT name,age FR ...