设计模式-单一职责及接口隔离原则

一:单一职责原则

简单理解就是,一个类只负责一项职责

若一个DAO类即可以操作user表,又可以操作order表,则不符合单一职责原则

应该分成两个DAO类(只有类中方法数量比较少,可以在方法级别上保持单一职责原则)

二:接口隔离原则

含义:一个类对另一个类的依赖应该建立在最小接口上,使用多个专门的接口比使用单一的总接口要好。
这么说可能不好理解,看完下边这个栗子,在看刚刚的定义,你会更容易理解。
举例:
有这样一个需求

系统中有三种角色,三个角色对订单的操作如下:
用户,只能有查询订单的方法
商家,只能有查询、添加订单的方法
管理员,有添加、删除、修改、查询订单的方法

实现方式一:
  1. 定义一个订单接口IOrder,其中包含增删改查四个方法,待实现类实现,代码如下:
//订单接口
interface IOrder{
	public void addOrder();
	public void deleteOrder();
	public void updateOrder();
	public void getOrder();
}
  1. 实现类Order继承接口IOrder,实现其内的方法,代码如下:
class Order implements IOrder{
	//使用输出字符串 模拟 具体操作
	@Override
	public void addOrder() {
		System.out.println("添加订单");
	}
	@Override
	public void deleteOrder() {
		System.out.println("删除订单");
	}
	@Override
	public void updateOrder() {
		System.out.println("修改订单");
	}
	@Override
	public void getOrder() {
		System.out.println("查询订单");
	}
}
  1. 测试
public class IsolateTest {
	//模拟用户使用系统
	//参数传入类型为接口IOrder,是为了满足“依赖倒转原则”,其实就是为了方便扩展,后续博客会讲解
	public static void UserUseSystem(IOrder order) {
		System.out.println("用户使用系统开始");
		order.getOrder();
		System.out.println("用户使用系统结束\n");
	}
	//模拟商家使用系统
	public static void ShopUseSystem(IOrder order) {
		System.out.println("商家使用系统开始");
		order.getOrder();
		order.addOrder();
		System.out.println("商家使用系统结束\n");
	}
	//模拟管理员使用系统
	public static void AdminUseSystem(IOrder order) {
		System.out.println("管理员使用系统开始");
		order.getOrder();
		order.addOrder();
		order.deleteOrder();
		order.updateOrder();
		System.out.println("管理员使用系统结束\n");
	}
	public static void main(String[] args) {
		//在不同角色使用系统时
		IOrder order=new Order();
		UserUseSystem(order);
		ShopUseSystem(order);
		AdminUseSystem(order);
	}
}
//输出结果可想而知,此处省略

这种方式虽然满足基本的需求,但是用户、商家、管理员都有了对订单增删改查的方法,但其实添加、删除、修改操作方法对用户来说是没有用的(或者说不安全的

接下来,根据接口隔离的原则,对代码进行改进。

实现方式二:

再看一眼接口隔离原则:一个类对另一个类的依赖应该建立在最小接口上,使用多个专门的接口比使用单一的总接口要好。

因此,我们可以把IOrder这个总接口,拆成针对不同角色的专门接口

  1. 接口拆分,代码如下
//接口隔离实现方法,将订单接口进行拆分,拆分分别面向用户、商家、管理员的接口
interface IOrderForUser{
	//只有查询操作
	public void getOrder();
}

interface IOrderForShop{
	//只有添加、查询操作
	public void addOrder();
	public void getOrder();
}

interface IOrderForAdmin{
	//增删改查
	public void addOrder();
	public void deleteOrder();
	public void updateOrder();
	public void getOrder();
}
  1. 实现类Order继承接口IOrderForUser、IOrderForShop、IOrderForAdmin,实现其内的方法,代码如下:
class Order implements IOrderForUser,IOrderForShop,IOrderForAdmin{
	@Override
	public void addOrder() {
		System.out.println("添加订单");
	}
	@Override
	public void deleteOrder() {
		System.out.println("删除订单");
	}
	@Override
	public void updateOrder() {
		System.out.println("修改订单");
	}
	@Override
	public void getOrder() {
		System.out.println("查询订单");
	}
}
  1. 测试
public class IsolateTest {
	//模拟用户使用系统
	public static void UserUseSystem(IOrderForUser order) {
		System.out.println("用户使用系统开始");
		order.getOrder();
		System.out.println("用户使用系统结束\n");
	}
	//模拟商家使用系统
	public static void ShopUseSystem(IOrderForShop order) {
		System.out.println("商家使用系统开始");
		order.getOrder();
		order.addOrder();
		System.out.println("商家使用系统结束\n");
	}
	//模拟管理员使用系统
	public static void AdminUseSystem(IOrderForAdmin order) {
		System.out.println("管理员使用系统开始");
		order.getOrder();
		order.addOrder();
		order.deleteOrder();
		order.updateOrder();
		System.out.println("管理员使用系统结束\n");
	}
	public static void main(String[] args) {
		//在不同角色使用系统时
		IOrderForUser iOrderForUser=new Order();
		IOrderForShop iOrderForShop=new Order();
		IOrderForAdmin iOrderForAdmin=new Order();
		UserUseSystem(iOrderForUser);
		ShopUseSystem(iOrderForShop);
		AdminUseSystem(iOrderForAdmin);
	}
}
//输出结果同实现方式一

实现方式二就解决了实现方式一中 用户、商家、管理员都有了对订单增删改查的操作的问题。

后记:

在书写博客过程中,想过另外一种讲解方法,大体思路是这样的:

实现方式一:
  1. 定义一个订单接口IOrder,其内包含 增删改查 四个待实现方法。
  2. 用户订单实现类UserOrder、商家订单实现类ShopOrder、管理员订单实现类AdminOrder分别实现接口IOrder。(因为考虑到不同角色对订单的同一个操作,可能不同)
  3. 然后说明一下,用户订单实现类UserOrder其实不需要实现订单接口IOrder中的添加、删除、修改方法,以此说明这种方法不好。
    引出
实现方式二:
  1. 定义三个接口
    接口IGetOrder:其内有只有查询订单的方法。
    接口IAddOrder:其内有只有添加订单的方法。
    接口IUpdateAndDeleteOrder:其内有修改、删除订单的方法。
  2. 然后
    用户订单实现类UserOrder实现接口IGetOrder。
    商家订单实现类ShopOrder实现接口IGetOrder和IAddOrder。
    管理员订单实现类AdminOrder实现接口IGetOrder和IAddOrder和IUpdateAndDeleteOrder。
    这样就解决的实现方式一中的问题,满足接口隔离原则。

参考链接:接口隔离原则

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计模式是软件设计中常用的最佳实践,它们是解决常见问题和复用已验证解决方案的经验总结。六大原则是 SOLID 原则,这些原则有助于编写可扩展、灵活且易于维护的代码。以下是 SOLID 原则及其优点: 1. 单一职责原则(Single Responsibility Principle, SRP): 每个类只做一件事,使其更易于测试和理解。优点是提高了模块的独立性和重用性。 2. 开闭原则(Open-Closed Principle, OCP): 对扩展开放,对修改关闭。通过接口或抽象类,可以在不修改原有代码的情况下增加新功能。这增强了系统的灵活性。 3. 里氏替换原则(Liskov Substitution Principle, LSP): 子类可以替换其基类而不会影响程序的正确性。确保子类继承的行为是一致的,有利于代码的可替换和适应变化。 4. 接口隔离原则(Interface Segregation Principle, ISP): 尽可能细化接口,避免大量无关的抽象方法,提高代码的可定制性。 5. 依赖倒置原则(Dependency Inversion Principle, DIP): 高层模块不应该依赖低层模块,两者都应依赖抽象。这样有利于模块间的解耦和测试。 6. 里氏替换原则(Liskov Substitution Principle, LSP,我在上一条已经提到了,这是个笔误,实际是单一职责原则,SOLID中有四个原则,没有LSP)。 遵循这些原则能帮助开发者编写出清晰、灵活、易于理解和维护的代码,提高团队协作效率,并且有助于项目的长期可持续发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值