设计原则-接口隔离

名称:接口隔离原则(Interface Segregation Principle)

定义:客户端不应该依赖它不需要的接口。即一个类对另一个类的依赖应该建立在最小的接口上。

分析:类UserInfoService通过接口InfoInterface依赖类UserInfoImpl,类OrderInfoService通过接口InfoInterface依赖类OrderInfoImpl,如果接口InfoInterface对于类UserInfoService和类OrderInfoService来说不是最小接口,那么类UserInfoImpl和类OrderInfoImpl必须去实现他们不需要的方法。

解决:将接口InfoInterface拆分成独立的几个接口,类UserInfoService和类OrderInfoService分别与他们需要的接口建立依赖关系,也就是采用接口隔离原则。

示例1:违反接口隔离原则

UML:

代码:

public class InterfaceSegregation {
    public static void main(String[] args) {
        //用户信息
        UserInfoImpl userInfoImpl = new UserInfoImpl();
        UserInfoService userInfoService = new UserInfoService();
        userInfoService.printUserName(userInfoImpl);
        userInfoService.printUserAge(userInfoImpl);
        //订单信息
        OrderInfoImpl orderInfoImpl = new OrderInfoImpl();
        OrderInfoService orderInfoService = new OrderInfoService();
        orderInfoService.printOrderId(orderInfoImpl);
        orderInfoService.printOrderAmount(orderInfoImpl);
    }
}

interface InfoInterface{
    void printUserName();
    void printUserAge();
    void printOrderId();
    void printOrderAmount();
}

class UserInfoImpl implements InfoInterface {
    @Override
    public void printUserName() {
        System.out.println("用户信息:姓名张三");
    }
    @Override
    public void printUserAge() {
        System.out.println("用户信息:年龄18");
    }
    @Override
    public void printOrderId() {

    }
    @Override
    public void printOrderAmount() {

    }
}

class OrderInfoImpl implements InfoInterface {
    @Override
    public void printUserName() {

    }
    @Override
    public void printUserAge() {

    }
    @Override
    public void printOrderId() {
        System.out.println("订单信息:订单唯一ID");
    }
    @Override
    public void printOrderAmount() {
        System.out.println("订单信息:订单金额");
    }
}

class UserInfoService {
    public void printUserName(UserInfoImpl info) {
        info.printUserName();
    }
    public void printUserAge(UserInfoImpl info) {
        info.printUserAge();
    }
}

class OrderInfoService {
    public void printOrderId(OrderInfoImpl info) {
        info.printOrderId();
    }
    public void printOrderAmount(OrderInfoImpl info) {
        info.printOrderAmount();
    }
}

示例2:遵守接口隔离原则

UML:

代码:

public class InterfaceSegregation2 {
    public static void main(String[] args) {
        //用户信息
        UserInfoImpl userInfoImpl = new UserInfoImpl();
        UserInfoService userInfoService = new UserInfoService();
        userInfoService.printUserName(userInfoImpl);
        userInfoService.printUserAge(userInfoImpl);
        //订单信息
        OrderInfoImpl orderInfoImpl = new OrderInfoImpl();
        OrderInfoService orderInfoService = new OrderInfoService();
        orderInfoService.printOrderId(orderInfoImpl);
        orderInfoService.printOrderAmount(orderInfoImpl);
    }
}

interface UserInfoInterface{
    void printUserName();
    void printUserAge();
}

interface OrderInfoInterface{
    void printOrderId();
    void printOrderAmount();
}

class UserInfoImpl implements UserInfoInterface {
    @Override
    public void printUserName() {
        System.out.println("用户信息:姓名张三");
    }
    @Override
    public void printUserAge() {
        System.out.println("用户信息:年龄18");
    }
}

class OrderInfoImpl implements OrderInfoInterface {
    @Override
    public void printOrderId() {
        System.out.println("订单信息:订单唯一ID");
    }
    @Override
    public void printOrderAmount() {
        System.out.println("订单信息:订单金额");
    }
}

class UserInfoService {
    public void printUserName(UserInfoImpl info) {
        info.printUserName();
    }
    public void printUserAge(UserInfoImpl info) {
        info.printUserAge();
    }
}

class OrderInfoService {
    public void printOrderId(OrderInfoImpl info) {
        info.printOrderId();
    }
    public void printOrderAmount(OrderInfoImpl info) {
        info.printOrderAmount();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值