物来顺应,未来不迎,当时不杂,既过不恋;|

万事胜意k

园龄:2年8个月粉丝:11关注:4

Java设计模式之七大设计原则

七大设计原则

设计原则概述

image-20231205202613963

单一职责原则

定义

一个类仅有一个引起它变化的原因

分析

image-20231205202755237

模拟场景

访客用户 普通用户 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();
  }
}

开闭原则

定义

对扩展开放,对修改关闭

也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。

分析

image-20231205205219706

模拟场景

求面积,对π精度要求不同

代码实现

/**
* 面积计算实现
*/
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);
  }
}

里氏代换原则

定义

开闭原则是从抽象化导出具体化。从抽象化到具体化的过程则需使用继承关系以及里氏代换原则

里式替换是实现开闭原则的途径之一,比开闭原则限制更强,像包含的关系

任何基类可以出现的地方,子类一定可以出现。

通俗理解:子类可以扩展父类的功能,但不能改变父类原有的功能。换句话说,子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。

分析

image-20231205211113414

依赖倒转原则

定义

细节应该依赖于抽象、抽象不应该依赖于细节

理解:

高层模块不依赖低层次模块的细节,不依赖具体实现,而是依赖于接口

要针对接口编程,不要针对实现编程

分析

image-20231218134444226

接口隔离原则

定义

客户端不应该依赖于那些它不需要的接口

用多个专门的接口,而不使用单一的总接口

举个例子,如果一个接口包含了多个方法,而某个实现类只需要其中的一部分方法,那么其他不需要的方法就成了冗余。如果其他类要实现这个接口,它们也会被迫实现这些不需要的方法,从而导致代码冗余和不必要的复杂性。

分析

image-20231218134733394

image-20231218134937843

合成复用原则

定义

优先使用对象组合,而不是继承来达到复用的目的

分析

复用时要尽量使用组合/聚合关系(关联关系),少用继承

image-20231218135328660

image-20231218135252331

 

迪米特法则(最少知识原则)

定义

最少知道、减少依赖

一个模块或对象应尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立,这样当一个模块修改时,影响的模块就会越少,扩展起来更加容易。

只和你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)。

其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

分析

应用迪米特法则可降低系统的耦合度

image-20231218140055507

本文作者:万事胜意k

本文链接:https://www.cnblogs.com/ysk0904/p/17911097.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   万事胜意k  阅读(13)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起