里氏替换原则应用-CRM系统中为客户发送邮件

里氏替换原则

里氏替换原则,要求所有引用基类的地方必须透明地使用其子类的对象。即任何基类出现的地方,子类一定可以出现。
简单理解为:
在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。

设计思想

里氏替换原则是实现开闭原则的重要方法之一,由于使用基类对象的地方都可以使用子类对象,因此在程序设计中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

注意的问题

(1)子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。根据里氏替换原则,为了保证系统的扩展性,在程序中通常使用父类来进行定义,如果一个方法只存在子类中,在父类中不提供相应的声明,则无法在以父类定义的对象中使用该方法。(其实可以理解为面向接口编程)
(2)尽量把父类设计为抽象类或接口,让子类继承或实现父类接口,运行时,子类实例替换父类实例,我们可以很方便地扩展系统的功能,同时无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。(遵循高内聚低耦合)

案例分析-CRM系统中为客户发送邮件

某CRM系统中,客户可以分为VIP客户VIPCustomer和普通用户CommonCustomer两类,系统需要提供一个发送Email的功能,原始设计方案如图
在这里插入图片描述
但是,在对系统进一步分析后发现,无论是普通客户还是VIP客户,发送邮件的过程都是相同的,也就是说两个send()方法中的代码重复了(增加了系统的耦合性),而且在系统中还将新增客户类型。为了让系统具有更好的扩展性,同时减少代码重复,使用里氏替换原则进行重构。
在这里插入图片描述
可以通过一下思想来解决问题,在本实例中,可以考虑增加一个新的抽象客户类Customer,而将CommonCustomer和VIPCustomer类作为其子类,邮件发送类EmailSender类针对抽象客户类Customer编程,根据里氏代换原则,能够接受基类对象的地方必然能够接受子类对象,因此将EmailSender中的send()方法的参数类型改为Customer,如果需要增加新类型的客户,只需将其作为Customer类的子类即可。(其实也体现了开闭原则)。

代码实现

package changeCRM;

public class Customer {
    private String name;
    private String email;
    public Customer() {
       
    }
    public Customer(String name, String email) {
        this.name = name;
        this.email = email;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }   
    
}
---------------------------------------------
package changeCRM;

public class CommonCustomer extends Customer{

    public void commonSend(){
        System.out.println("普通顾客发送邮件。。。。");
        
    }
    
}
---------------------------------------------------------
package changeCRM;

public class VipCustomer extends Customer{

    public void vipSend(){
        System.out.println("Vip顾客发送邮件。。。。");
        
    }
}
---------------------------------------------------------
package changeCRM;

public class EmailSender {

    public void send(Customer customer){
        
        System.out.println(customer.getName()+"发送邮件,他的邮箱是"+customer.getEmail());
    }
    
}
----------------------------------------------------------
package changeCRM;

public class changeTest {
    public static void main(String[] args) {
       Customer customer=new Customer("张三","123@qq.com");
        VipCustomer vip=new VipCustomer();
        CommonCustomer commonCustomer=new CommonCustomer();
         EmailSender sender=new EmailSender();
        sender.send(customer);
        System.out.println("------------------------");
        commonCustomer.commonSend();
        System.out.println("-------------------------");
        vip.vipSend();

    } 
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小辉在线

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值