Java设计模式之七大设计原则
设计原则概述
单一职责原则
定义
一个类仅有一个引起它变化的原因
分析
模拟场景
访客用户 普通用户 VIP用户
代码实现
/** * 视频用户接口 */ public interface IVideoUserService { void definition(); void advertisement(); }
/** * 访客用户 */ public class GuestVideoUserService implements IVideoUserService { public void definition() { System.out.println("访客用户,视频480P高清"); } public void advertisement() { System.out.println("访客用户,视频有广告"); } }
/** * 普通用户 */ public class OrdinaryVideoUserService implements IVideoUserService { public void definition() { System.out.println("普通用户,视频720P超清"); } public void advertisement() { System.out.println("普通用户,视频有广告"); } }
/** * VIP用户 */ public class VipVideoUserService implements IVideoUserService { public void definition() { System.out.println("VIP用户,视频1080P蓝光"); } public void advertisement() { System.out.println("VIP会员,视频无广告"); } }
public class Client { public static void main(String[] args) { // 访客用户 GuestVideoUserService guest = new GuestVideoUserService(); guest.definition(); guest.advertisement(); // 普通用户 OrdinaryVideoUserService ordinary = new OrdinaryVideoUserService(); ordinary.definition(); ordinary.advertisement(); //VIP用户 VipVideoUserService vip = new VipVideoUserService(); vip.definition(); vip.advertisement(); } }
开闭原则
定义
对扩展开放,对修改关闭
也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。
分析
模拟场景
求面积,对π精度要求不同
代码实现
/** * 面积计算实现 */ public class CalculationArea implements ICalculationArea { private final static double π = 3.14D; public double rectangle(double x, double y) { return x * y; } public double triangle(double x, double y, double z) { double p = (x + y + z) / 2; return Math.sqrt(p * (p - x) * (p - y) * (p - z)); } public double circular(double r) { return π * r * r; } }
/** * 扩展继承,实现自己的需求 */ public class CalculationAreaExt extends CalculationArea { private final static double π = 3.141592653D; @Override public double circular(double r) { return π * r * r; } }
/** * 面积计算接口 */ public interface ICalculationArea { /** * 计算面积,长方形 * * @param x 长 * @param y 宽 * @return 面积 */ double rectangle(double x, double y); /** * 计算面积,三角形 * @param x 边长x * @param y 边长y * @param z 边长z * @return 面积 * * 海伦公式:S=√[p(p-a)(p-b)(p-c)] 其中:p=(a+b+c)/2 */ double triangle(double x, double y, double z); /** * 计算面积,圆形 * @param r 半径 * @return 面积 * * 圆面积公式:S=πr² */ double circular(double r); }
public class Client { public static void main(String[] args) { CalculationAreaExt calculationAreaExt = new CalculationAreaExt(); double res = calculationAreaExt.circular(10); System.out.println(res); } }
里氏代换原则
定义
开闭原则是从抽象化导出具体化。从抽象化到具体化的过程则需使用继承关系以及里氏代换原则
里式替换是实现开闭原则的途径之一,比开闭原则限制更强,像包含的关系
任何基类可以出现的地方,子类一定可以出现。
通俗理解:子类可以扩展父类的功能,但不能改变父类原有的功能。换句话说,子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
分析
依赖倒转原则
定义
细节应该依赖于抽象、抽象不应该依赖于细节
理解:
高层模块不依赖低层次模块的细节,不依赖具体实现,而是依赖于接口
要针对接口编程,不要针对实现编程
分析
接口隔离原则
定义
客户端不应该依赖于那些它不需要的接口
用多个专门的接口,而不使用单一的总接口
举个例子,如果一个接口包含了多个方法,而某个实现类只需要其中的一部分方法,那么其他不需要的方法就成了冗余。如果其他类要实现这个接口,它们也会被迫实现这些不需要的方法,从而导致代码冗余和不必要的复杂性。
分析
合成复用原则
定义
优先使用对象组合,而不是继承来达到复用的目的
分析
复用时要尽量使用组合/聚合关系(关联关系),少用继承
迪米特法则(最少知识原则)
定义
最少知道、减少依赖
一个模块或对象应尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立,这样当一个模块修改时,影响的模块就会越少,扩展起来更加容易。
只和你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)。
其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
分析
应用迪米特法则可降低系统的耦合度
本文作者:万事胜意k
本文链接:https://www.cnblogs.com/ysk0904/p/17911097.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步