设计模式6大原则-接口隔离原则
定义:
(1) 客户不应该依赖它不需要的接口
(2) 类间的依赖关系应该建立在最小的接口上
接口隔离原则要达到的目的就是细化接口,将臃肿的接口拆分成多个独立的接口,接口应该删除掉不需要的方法,类与类之间通过他们需要的接口建立依赖关系。
如果一个接口包含多种模块功能的方法,而且这个接口被多个模块依赖,需要对各个模块规定访问权限,规定每个模块能访问哪些方法,这样的设计是不复合接口隔离原则的,接口隔离原则要求尽量拆分成多个不同模块的接口,每个模块依赖他们需要关心的接口,从而避免一些可以访问到但是业务逻辑要求不能访问的方法。
说白了就是如果我依赖的接口或者类中的 public 方法,我都应该能访问调用它,如果不想让我访问就别向我展现这样的 public 方法。
以现实生活为例
每个人在不同场合扮演的角色是不一样的
在家里可能是个和蔼可亲的父亲
在公司是个严格的老板
在朋友面前是个真诚善良的老大哥
在家里孩子关心的角色是父亲,以及父亲的职责
在公司同事关心的角色是老板,以及老板的职责
在朋友间关心的角色是朋友,以及朋友的职责
如何设计?
如果将父亲的职责、老板的职责、朋友的职责 都封装到一个接口中,首先导致接口的臃肿,然后就是朋友能访问到老板的职责,以及父亲的职责,这是不对的,所以通过不同的职责拆分为三个接口分别是 父亲接口、老板接口、朋友接口,将不同的接口添加依赖到不同的人上。
设计类图如下
代码实现如下
父亲接口
// 父亲接口
public interface IFather
{
// 买礼物
void Gift(string gift);
}
老板接口
// 老板接口
public interface IBoss
{
// 分配任务
void Task(string task);
}
朋友接口
// 朋友接口
public interface IFriend
{
// 跟朋友喝酒
void Drink();
}
人类:实现三个接口
// 实现不同的接口
public class Person : IFather, IBoss, IFriend
{
// 买礼物
public void Gift(string gift)
{
Console.WriteLine(gift);
}
// 分配任务
public void Task(string task)
{
Console.WriteLine(task);
}
// 跟朋友喝酒
public void Drink()
{
Console.WriteLine("跟朋友一起喝酒 \n");
}
}
同事类
public class Colleague
{
// 依赖老板接口
private IBoss _iBoss;
public void SetBoss(IBoss boss)
{
_iBoss = boss;
}
public void DoAction()
{
_iBoss.Task("老板请给我分配任务 \n");
}
}
朋友类
public class Friend
{
// 依赖朋友接口
private IFriend _iFriend;
public void SetFriend(IFriend friend)
{
_iFriend = friend;
}
public void DoAction()
{
_iFriend.Drink();
}
}
孩子类
public class Child
{
private IFather _iFathre;
public void SetFather(IFather father)
{
_iFathre = father;
}
public void DoAction()
{
_iFathre.Gift("我要礼物 \n");
}
}
代码调用如下
public class Client
{
public Client()
{
Person person = new Person();
Friend friend = new Friend();
friend.SetFriend(person);
friend.DoAction();
Colleague colleague = new Colleague();
colleague.SetBoss(person);
colleague.DoAction();
Child child = new Child();
child.SetFather(person);
child.DoAction();
}
}
运行结果如下