什么是装饰器模式?
装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。(抄来的)
装饰器模式主要有4个角色:
抽象接口:抽离出最基本的需求。
比如小卖铺家的房子马上要交付了,装修就是我最基本的需求
具体对象:最基本的需求实现。
假设我老婆是个设计师,室内设计就是我自己做的基本实现。
基本装饰角色:抽象类,接收请求,将请求转发给具体的装饰角色。
我去找了个包工头来按照我的设计图做装修的工作
具体装饰角色:负责具体功能的装饰活动。
包工头自己不做事,找了一堆小工来干活,有装水电的、有装窗户的、有铺地板的
本质来讲干活的小工和我来说没有任何关系,我可以自由的选择不同的人来干活,这就是装饰器模式。
装饰器模式的优点如果我不找包工头装修公司来帮我装修,我会找家里的叔叔阿姨来帮我干活,想想我都头大。
找了装修公司后是不是一下省了好多活,思路也更清洗了。
同样,装饰器模式也有类似的优点
被装饰类(具体对象)和装饰类(具体装修角色)没有耦合关系,可以各自独立发展。
代码结构更加清晰,有利于后续的项目维护
动态扩展对象功能,比继承更加灵活,可以对一个对象作出不同的修饰组合,满足复杂的功能需求
案例的简单实现以上文中的装修案例为例,我们实现以下代码。
1、首先是基本需求的接口:
2、然后是需求最基本的实现
我自己完成的室内设计图纸
3、接着到接口,基本装饰角色,也就是包工头了
/** * 基本装饰类 * @author laoyeye.net * */ public abstract class BaseDecorator implements IDecorator{ private IDecorator decorator; public BaseDecorator(IDecorator decorator) { this.decorator = decorator; } /** * 调用装饰方法 */ @Override public void decorate() { if(decorator != null) { decorator.decorate(); } } }4、最后是具体装饰角色,实现对基本功能的扩展
/** * 窗户装饰者 * @author laoyeye.net * */ public class WindowDecorator extends BaseDecorator{ public WindowDecorator(IDecorator decorator) { super(decorator); } /** * 窗帘具体装饰方法 */ @Override public void decorate() { super.decorate(); System.out.println("窗户小工,开始装饰窗户"); } } /** * 家具装饰类 * @author laoyeye.net * */ public class FurnitureDecorator extends BaseDecorator{ public FurnitureDecorator(IDecorator decorator) { super(decorator); } /** * 家具装饰方法 */ @Override public void decorate() { super.decorate(); System.out.println("家具小工, 开始装饰家具"); } }5、最后我们来运行下上述代码,看下效果:
public class App { public static void main(String[] args) { IDecorator decorator = new Decorator(); IDecorator windowDecorator = new WindowDecorator(decorator); IDecorator waterDecorator = new FurnitureDecorator(windowDecorator); waterDecorator.decorate(); } }效果如下:
老婆画好了装修设计图 窗户小工,开始装饰窗户 家具小工, 开始装饰家具这样就基本实现了装饰者模式,但是相信很多同学有我刚开始学设计模式时的疑惑,这段代码我是看懂了,但是我怎么应用呢?我项目上啥时候可以用到呢。
这里我们再举个具体项目上的案例,相信看了项目案例后大家心里都会有个概念了。
首先在互联网金融中,很多时候用户会选择投资一个线上的标的。同时为了吸引用户,商家也会给用户发很多种类型的现金券、红包、加息券之类的。
这里我们就简单实现,不做过多限制。
假设一个用户要买一个线上标的5000份,每份的金额为1元,正常情况下,客户应该支付5000元。但是因为我们给客户发了优惠券和红包之类的,实际用户支付的钱并没有那么多。如何设计一个架构简洁,高可维护的系统呢,这时候我们就可以用到本文所讲的装饰者模式。
先介绍几个实体类:
1、订单类
客户实际下的订单信息: