概念
里氏替换原则是任何基类出现的地方,子类一定可以替换它;是建立在基于抽象、多态、继承的基础复用的基石,该原则能够保证系统具有良好的拓展性,同时实现基于多态的抽象机制,能够减少代码冗余。
实现
里氏替换原则要求我们在编码时使用基类或接口去定义对象变量,使用时可以由具体实现对象进行赋值,实现变化的多样性,完成代码对修改的封闭,扩展的开放。如:商城商品结算中,定义结算接口Istrategy,该接口有三个具体实现类,分别为PromotionalStrategy (满减活动,两百以上百八折)、RebateStrategy (打折活动)、 ReduceStrategy(返现活动);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public interface Istrategy { public double realPrice( double consumePrice); } public class PromotionalStrategy implements Istrategy { public double realPrice( double consumePrice) { if (consumePrice > 200 ) { return 200 + (consumePrice - 200 ) * 0.8 ; } else { return consumePrice; } } } public class RebateStrategy implements Istrategy { private final double rate; public RebateStrategy() { this .rate = 0.8 ; } public double realPrice( double consumePrice) { return consumePrice * this .rate; } } public class ReduceStrategy implements Istrategy { public double realPrice( double consumePrice) { if (consumePrice >= 1000 ) { return consumePrice - 200 ; } else { return consumePrice; } } } |
调用方为Context,在此类中使用接口定义了一个对象。其代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class Context { //使用基类定义对象变量 private Istrategy strategy; // 注入当前活动使用的具体对象 public void setStrategy(Istrategy strategy) { this .strategy = strategy; } // 计算并返回费用 public double cul( double consumePrice) { // 使用具体商品促销策略获得实际消费金额 double realPrice = this .strategy.realPrice(consumePrice); // 格式化保留小数点后1位,即:精确到角 BigDecimal bd = new BigDecimal(realPrice); bd = bd.setScale( 1 , BigDecimal.ROUND_DOWN); return bd.doubleValue(); } } |
Context 中代码使用接口定义对象变量,这个对象变量可以是实现了lStrategy接口的PromotionalStrategy、RebateStrategy 、 ReduceStrategy任意一个。
拓展
里氏替换原则和依赖倒置原则,构成了面向接口编程的基础,正因为里氏替换原则,才使得程序呈现多样性。
以上就是java面向对象设计原则之里氏替换原则示例详解的详细内容,更多关于java面向对象设计里氏替换原则的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/guoyp2126/article/details/113919502