设计模式
设计模式示例代码库地址:
https://gitee.com/Jasonpupil/designPatterns
设计模式原则
单一职责原则(SPS):
-
又称单一功能原则,面向对象五个基本原则(SOLID)之一
-
原则定义:一个类应该只有一个发生变化的原因
-
使用
if else
进行判断实现不好维护 -
模式场景:视频网站,存在
访客用户(视频480p高清,并有广告)
、普通用户(视频720p超清,并有广告)
和VIP用户(视频1080p蓝光,没有广告)
if else
处理方式示例代码:
/*** @Description: 视频用户服务* @Author: pupil* @Date: 2024/06/21 下午 8:12*/ public class VideoUserService {public void serveGrade(String userType){if ("VIP用户".equals(userType)){System.out.println("VIP用户,视频1080p蓝光");}else if ("普通用户".equals(userType)){System.out.println("普通用户,视频720p超清");}else if ("访客用户".equals(userType)){System.out.println("访客用户,视频480p高清");}} }/*** @description:测试验证* @author: pupil* @data: 2024/06/21 下午 7:57*/ public class ApiTest {public static void main(String[] args) {VideoUserService service = new VideoUserService();service.serveGrade("VIP用户");service.serveGrade("普通用户");service.serveGrade("访客用户");} }
结果:
- 根据
单一职责原则
处理方式示例代码:
/*** @Description: 视频用户服务接口* @Author: pupil* @Date: 2024/06/21 下午 8:17*/ public interface IVideoUserService {void definition();void advertisement(); }/*** @Description: 访客用户* @Author: pupil* @Date: 2024/06/21 下午 8:18*/ public class GuestVideoUserServiceImpl implements IVideoUserService {@Overridepublic void definition() {System.out.println("访客用户,视频480p超清");}@Overridepublic void advertisement() {System.out.println("访客用户,视频有广告");} }/*** @Description: 普通用户* @Author: pupil* @Date: 2024/06/21 下午 8:19*/ public class OrdinaryVideoUserServiceImpl implements IVideoUserService {@Overridepublic void definition() {System.out.println("普通用户,视频720p超清");}@Overridepublic void advertisement() {System.out.println("普通用户,视频有广告");} }/*** @Description: VIP用户* @Author: pupil* @Date: 2024/06/21 下午 8:20*/ public class VipVideoUserServiceImpl implements IVideoUserService {@Overridepublic void definition() {System.out.println("VIP用户,视频1080p蓝光");}@Overridepublic void advertisement() {System.out.println("VIP会员,视频无广告");} }/*** @Description: 测试验证* @Author: pupil* @Date: 2024/06/21 下午 8:24*/ public class ApiTest {public static void main(String[] args) {IVideoUserService guest = new GuestVideoUserServiceImpl();guest.definition();guest.advertisement();System.out.println("=================================");IVideoUserService ordinary= new OrdinaryVideoUserServiceImpl();ordinary.definition();ordinary.advertisement();System.out.println("=================================");IVideoUserService vip = new VipVideoUserServiceImpl();vip.definition();vip.advertisement();} }
结果:
根据单一职责原则的示例类图:
接口和类是实现关系
开闭原则
-
开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”
-
让类依赖于固定的抽象,所以对修改是封闭的
-
而通过面向对象的继承和多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的
-
提高复用性:
- 通过抽象提高灵活性:使用抽象类或接口定义功能,使具体实现可以灵活替换。这种方法允许开发者在不改变现有代码的基础上增加新功能。
- 减少代码重复:将通用的行为放在基类或接口中,具体实现类通过继承和实现来扩展这些行为。这减少了重复代码的出现,使代码更易于维护和复用。
-
提高维护性:
- 降低风险:增加新功能时无需修改现有代码,减少引入新错误的风险,增强系统稳定性
- 独立测试:模块更加独立,便于单独测试和调试。接口测试确保所有实现类符合预期行为,只需测试新代码
- 职责单一:各模块职责明确,代码结构清晰,便于理解和修改,开发人员能快速找到扩展点。
-
使用场景:支付方式,
进行付款时存在不同的付款方式,在已有的微信支付的方式上新添加根据金额自动选择微信余额支付还是绑定的银行卡支付
示例代码:
/*** @Description: 支付处理接口* @Author: pupil* @Date: 2024/06/22 下午 9:25*/ public interface PaymentProcessor {void processPayment(double amount); }/*** @Description: 微信支付* @Author: pupil* @Date: 2024/06/22 下午 9:49*/ public class WeChatProcessor implements PaymentProcessor {@Overridepublic void processPayment(double amount) {System.out.println("使用微信余额支付");} }/*** @Description: 扩展微信支付,添加从银行卡扣钱* @Author: pupil* @Date: 2024/06/22 下午 9:33*/ public class BankCardProcessor extends WeChatProcessor {/*** 当amount大于100时用银行卡支付* @param amount*/@Overridepublic void processPayment(double amount) {if (amount<=100){System.out.println("使用微信余额支付");}else {System.out.println("使用银行卡支付");}}}/*** @Description: PayPal支付实现* @Author: pupil* @Date: 2024/06/22 下午 9:49*/ public class PayPalProcessor implements PaymentProcessor {@Overridepublic void processPayment(double amount) {System.out.println("使用PayPal支付");} }/*** @Description: 测试验证* @Author: pupil* @Date: 2024/06/21 下午 8:13*/ public class ApiTest {@Testpublic void test_BankCardProcessor(){PaymentProcessor processor = new BankCardProcessor();processor.processPayment(150);processor.processPayment(90);}@Testpublic void test_WeChatProcessor(){PaymentProcessor processor = new WeChatProcessor();processor.processPayment(150);}@Testpublic void test_PayPalProcessor(){PaymentProcessor processor = new PayPalProcessor();processor.processPayment(150);}}
结果:
-
微信支付类的扩展类:
-
微信支付类:
-
根据开闭原则的示例类图:
微信支付类和PayPal支付类与支付接口是实现关系
微信支付类与微信支付扩展类是泛化关系