关于设计模式,如果使用得当,将会使我们的代码更加简洁,并且更具扩展性。本文主要讲解春天中如何使用策略模式,工厂方法模式以及建筑模式。
1. 策略模式
关于策略模式的使用方式,在春天中其实比较简单,从本质上讲,策略模式就是一个接口下有多个实现类,而每种实现类会处理某一种情况。我们以发奖励为例进行讲解,比如我们在抽奖系统中,有多种奖励方式可供选择,比如积分,虚拟币和现金等。在存储时,我们必然会使用一个类似于类型的字段用于表征这几种发放奖励的,那么这里我们就可以使用多态的方式进行奖励的发放。比如我们抽象出一个PrizeSender的接口,其声明如下:
<前> public interface PrizeSender {/* *才能 ,,*,用于判断当前实例是否支持当前奖励的发放 ,,*/boolean 才能支持(SendPrizeRequest 请求);,,/* * ,,*,发放奖励 ,,*/void 才能sendPrize (SendPrizeRequest 请求); } >之前该接口中主要有两个方法:支持()和sendPrize(),其中支持()方法主要用于判断各个子类是否支持当前类型数据的处理,而sendPrize()则主要是用于进行具体的业务处理的,比如这里奖励的发放。下面就是我们三种不同类型的奖励发放的具体代码:
<前>//,积分发放@Componentpublic class PointSender implements PrizeSender {@Override才能 public 才能;boolean 支持(SendPrizeRequest 请求),{,,,return request.getPrizeType (),==, PrizeTypeEnum.POINT; ,,},@Override public 才能;void  sendPrize (SendPrizeRequest 请求),{ ,,,System.out.println(“发放积分“); ,,} } >之前 <前>//,虚拟币发放@Componentpublic class VirtualCurrencySender implements PrizeSender {@Override才能 public 才能;boolean 支持(SendPrizeRequest 请求),{,,,return PrizeTypeEnum.VIRTUAL_CURRENCY ==, request.getPrizeType (); ,,},@Override public 才能;void  sendPrize (SendPrizeRequest 请求),{ ,,,System.out.println(“发放虚拟币“); ,,} } >之前 <前>//,现金发放@Componentpublic class CashSender implements PrizeSender {@Override才能 public 才能;boolean 支持(SendPrizeRequest 请求),{,,,return PrizeTypeEnum.CASH ==, request.getPrizeType (); ,,},@Override public 才能;void  sendPrize (SendPrizeRequest 请求),{ ,,,System.out.println(“发放现金“); ,,} } >之前这里可以看的到,在每种子类型中,我们只需要在支持()方法中通过请求的某个参数来控制当前请求是否是当前实例能够处理的类型,如果是,则外层的控制逻辑就会将请求交给当前实例进行处理。关于这个类的设计,有几个点需要注意:
-
<李>
使用@ component注解对当前类进行标注,将其声明为春容器所管理的一个豆;
李> <李>声明一个返回布尔值的类似于支持()的方法,通过这个方法来控制当前实例是否为处理目标要求的实例;
李> <李>声明一个类似于sendPrize()的方法用于处理业务逻辑,当然根据各个业务的不同声明的方法名肯定是不同的,这里只是一个对统一的业务处理的抽象;
李> <李>无论是支持()方法还是sendPrize()方法,都需要传一个对象进行,而不是简简单单的基本类型的变量,这样做的好处是后续如果要在请求中新增字段,那么就不需要修改接口的定义和已经实现的各个子类的逻辑;
李>2. 工厂方法模式
上面我们讲解了如何使用弹簧来声明一个策略模式,那么如何为不同的业务逻辑来注入不同的豆呢,或者说外层的控制逻辑是什么样的,这里我们就可以使用工厂方法模式了。所谓的工厂方法模式,就是定义一个工厂方法,通过传入的参数,返回某个实例,然后通过该实例来处理后续的业务逻辑。一般的,工厂方法的返回值类型是一个接口类型,而选择具体子类实例的逻辑则封装到了工厂方法中了。通过这种方式,来将外层调用逻辑与具体的子类的获取逻辑进行分离。如下图展示了工厂方法模式的一个示意图: