设计模式概述
1)设计模式种类
创建型模式:提供创建对象的机制,提升已有代码的灵活性和可复用性。
结构型模式:介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效。
行为模式:负责对象间的高效沟通和职责传递委派。
2)六大设计原则
2.1)单一职责原则定义:约定一个类应该有且仅有一个改变类的原因;
示例:当在各类视频网站看电影、电视剧时,网站针对不同的用户类型,会在用户观看时给出不同的服务反馈,如以下三种:访客用户、普通会员、VIP 会员。
违背原则方案:根据不同的用户类型,判断用户可以观看视频的类型
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高清");
}
}
}
如果面对频繁迭代的业务需求,这样的代码结构就很难支撑系统迭代,每一次需求的实现都可能会影响其他逻辑,给整个接口服务带来不可控的风险。
单一职责原则改善代码:
为了满足这样不断迭代的需求,就不能使用一个类把所有职责行为混为一谈,而是需要提供一个上层的接口类,对不同的差异化用户给出单独的实现类,拆分各自的职责边界,定义接口:
public interface IVideoUserService {
// 视频清晰级别;480P、720P、1080P
void definition();
// 广告播放方式;无广告、有广告
void advertisement();
}
访客用户实现类,只能观看480P高清视频,同时需要观看广告
public class GuestVideoUserService implements IVideoUserService {
public void definition() {
System.out.println("访客用户,视频480P高清");
}
public void advertisement() {
System.out.println("访客用户,视频有广告");
}
}
普通会员实现类,可以观看720P超清视频,另外也需要观看广告
public class OrdinaryVideoUserService implements IVideoUserService {
public void definition() {
System.out.println("普通用户,视频720P超清");
}
public void advertisement() {
System.out.println("普通用户,视频有广告");
}
}
VIP会员实现类。可以观看更高清的视频,同时不需要观看广告
public class VipVideoUserService implements IVideoUserService {
public void definition() {
System.out.println("VIP用户,视频1080P蓝光");
}
public void advertisement() {
System.out.println("VIP用户,视频无广告");
}
}
单元测试
public class ApiTest {
@Test
public void test_VideoUserService() {
IVideoUserService guest = new GuestVideoUserService();
guest.definition();
guest.advertisement();
IVideoUserService ordinary = new OrdinaryVideoUserService();
ordinary.definition();
ordinary.advertisement();
IVideoUserService vip = new VipVideoUserService();
vip.definition();
vip.advertisement();
}
}
结构如下:
通过利用单一职责原则的代码优化后,现在每个类都只负责自己的用户行为。后续无论扩展新的功能还是需要在某个时刻修改某个用户行为类,都可以非常方便地开发和维护。
在项目开发的过程中,尽可能保证接口的定义、类的实现以及方法开发保持单一职责,对项目后期的迭代和维护会有很大的帮助。
内容来源 ---《重学Java设计模式》