账单类BillDecorator作为支付功能的扩展类,它应该具备支付的所有能力,包括支付、查询和退款
退款扩展类RefundDecorator正好有这三个方法,所以让账单类直接继承退款扩展类就可以了
但是别忘了,在退款类中需要给Payment提供实例化的机会,目的在于调用Payment类的pay()和query()方法
所以在账单类中也要给Payment提供实例化的机会,它才也能调用这两个方法
还有一个refund()方法不能调用,所以还要给退款方法所在的类RefundDecorator提供实例化的机会
总结一下就是账单类里面要给Payment和RefundDecorator两个类提供实例化的机会
因为RefundDecorator类中已经给Payment提供了实例化方法,所以我们只需要在账单类里面给RefundDecorator类提供实例化方法就可以了
ps:上面这段逻辑稍微有点绕,但是并不复杂,都是面向对象编程中继承的一些基础知识点,细读几遍很容易理解的
所以,账单类的代码应该这样写
这样我们就完成了对账功能,其实这个账单类也是一个装饰器
在需要对账的时候可以这样调用
BillDecorator billDecorator = new BillDecorator(new RefundDecorator(
new AliPayment()));
billDecorator.pay("赫连小伍测试支付宝支付");
billDecorator.query("赫连小伍测试支付宝查询");
billDecorator.refund("赫连小伍测试支付宝退款");
billDecorator.check("赫连小伍测试支付宝对账");
上面的代码在new对象的时候是不是像极了套娃
如果后期需求一直不断增加,我们的代码可以一直套娃下去
套娃一时爽,一直套娃一直爽
总结装饰器模式属于设计模式三大类型中的结构型设计模式,它的主要作用是通过将父类对象作为子类对象的属性从而给父类对象绑定新的行为
在你希望增加原有对象的行为,而又不想要修改原有对象时,可以考虑使用装饰器模式
装饰器模式的实现步骤总共有两步:
提供一个新的类定义需要扩展的方法,并使这个类继承或实现原有对象,让其拥有原有对象的所有行为
将原有对象作为新定义的类的属性,并为其提供实例化的方法
优点
无需修改原有对象即可扩展它的行为
可以通过多个装饰器为对象绑定不同的行为,使对象的使用更灵活
缺点
装饰器的层级递进关系比较明显,想要实现不受顺序影响的装饰器比较困难
装饰器层级比较深时,调用时套娃比较多,代码看起来不美观