小码设计模式

记录熟悉下常用的9种设计模式

先上Git地址:https://github.com/lance2038/DesignPatterns

代码中有简单的应用场景,此贴主要做记录,就不贴代码了,具体的参见README.MD,找对应的package就ok了

代理模式

代理模式主要有3种:1.静态代理 2.jdk动态代理 3.cglib动态代理

特点:对象间接访问,由代理对象去访问,再访问前后可以处理一些代理类的业务

优点:1.静态代理效率高 2.降低耦合度 3.扩展性强 4.职责清晰

缺点:1.静态代理只能为一个接口服务且接口增加方法,代理类也需重写方法 2.jdk代理必须实现接口,不能对类代理 3.cglib需要第三方jar,不能代理final方法,且效率低于jdk1.8后的jdk代理

应用场景:类aop进行日志记录、缓存记录

详见:com.proxy

工厂模式

代理模式主要有3种:1.静态工厂 2.工厂方法 3.抽象工厂

1.静态工厂模式

特点:创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象

优点:动态创建对象,只知道名字即可,拓展性好,良好的封装性

缺点:每增加一个产品,相应的也要增加一个子工厂,系统复杂度较高

应用场景:传入Mysql或者Oracle等名称动态的创建对应的数据源

详见:com.factory.staticfactory

2.工厂方法模式

特点:定义一个用于创建对象的接口,让子类绝对实例化哪一个类,工厂方法使一个类的实例化延迟到其子类

优点:良好的封装性,代码结构清晰,拓展性强,高层模块只需要知道产品的抽象类,其他实现类都不用关心

缺点:每增加一个产品,相应的也要增加一个子工厂,系统复杂度较高

应用场景:以数据库连接为例,我们可以根据我们的需要动态的去创建oracle或者mysql的连接,将连接信息封装到子类中,调用的时候很方便

详见:com.factory.factorymethod

3.抽象工厂模式

特点:为创建一组相关或者相互依赖的对象提供一个接口,而且无须指定它们的具体类

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

应用场景:可以从数据库工厂DataBaseInformationFactory中获取一个oracle的工厂OracleInformationFactory,并获取oracle工厂中的熟悉

详见:com.factory.abstractfactory

单例模式

特点:一个类有且仅有一个实例,并且提供了一个全局的访问点

优点:在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化

应用场景:资源读取 通用日志记录器

详见:com.singleton

委派模式

特点:委派模式可以根据不同的请求信息去访问请求信息绑定的类,也可以将请求信息与方法绑定起来,根据反射去请求方法

应用场景:传入一个我们需要执行的请求标识,可以根据请求标识去执行其绑定的业务,比如报文解析,传入的信息是这样的 xxxx(服务编码)yyyyyyyyyyy(明细内容)
我们可以截取到xxxx服务编码,根据xxxx去执行其所绑定的业务

详见:com.delegate

策略模式

特点:一个类的行为或其算法可以在运行时更改

优点:1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点:1、策略类会增多。 2、所有策略类都需要对外暴露。

应用场景:比如访问http请求可以使用httpclient、okhttp及其他,使用策略模式可以动态的设置是使用httpclient或是okhttp或其他http工具包

详见:com.strategy

原型模式

特点:用于创建重复的对象,同时又能保证性能

应用场景:1.使用序列化进行深拷贝,被克隆对象需实现序列化接口Serializable且性能较低
                  2.利用反射进行深拷贝,性能较高

详见:com.prototype

模板方法模式

特点:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行

优点:1.封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

应用场景:
 计算商品优惠价格的方式是一定的(比如满减、折扣)不同的活动只需传入不同的折扣和满减规则调用模板去计算价格即可

详见:com.templet

装饰器模式

特点:一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀

优点:可以弹性的装饰/包装/拓展某一个类,根据需要组合不同的组件,不互相耦合,可代替子类继承拓展

缺点:多层装饰嵌套系统运行流程不够直观

应用场景:
 比如我们需要处理一个报文,报文是xxxxxxxx<yyy>zzzz</yyy>这种 加密字符串 + xml字符串 的格式,执行业务之前需要先解析xxxxxxxx是否合规
不合规直接返回,合规才运行继续执行,这样我们的业务类BusinessServiceImpl不需要做任何改变,只处理纯粹的业务,校验报文只需要给它套一层校验包装类SecurityDecorator即可
如果我们需要加日志?那就再套一层日志包装类LoggerDecorator就ok了,而且可以调换包装类的顺序选择记录解密后的日志还是解密前的日志

详见:com.decorator

观察者模式

特点:当观察者发现某件事情变动时,则会自动通知它的订阅对象

应用场景:
我们的多个服务订阅了一个redis观察者的消息,如果服务端发现redis掉线,则通知服务使用数据库的数据,若发现redis上线,则使用redis数据

详见:com.observer

to be continued

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值