创建型模式
顾名思义,用来创建对象使用。
工厂模式,建造者模式,单例模式
结构型模式
用来改变类的结构,包一层或者组合一些东西进去。
适配器模式,装饰器模式,代理模式,桥接模式,外观模式,组合模式,享元模式。
行为型模式
用于描述某些类之间的职责划分和相互协作关系。
策略模式、模板模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
三层模式
目前开发都是Controller,Service,ServiceImpl,Dao三层模式。
如上图所示,Service一般都是一个接口,里面定义了抽象方法,其实有个疑问,如果不是共性的东西,是否需要这个Service?
这个Service的作用是什么?
假如存在如下这个SmsService,他集Controller,Service,Dao层于一体,是否可以?
@Controller
@RequestMapping("/sms")
@Service(value="smsService")
@Mapper
public class SmsService{
@RequestMapping("/sendSms")
public boolean sendSms(String smsId){
//1. 从数据库查询获取sms info
SmsInfo info = this.findOne(smsId);
//2. 发送短信
this.send(info);
//3. 返回前端结果
return true;
}
}
当上述代码一直如此,两三年都不会变时,我觉得是可以的。
不得不吐槽的是,项目中大量充斥着一个Service对应一个ServiceImpl的结构,其实这种Service都是重复的。
public interface SmsService{}
@Service
public class SmsYidongService implements SmsService{}
@RestController
public class SmsController{
@Autowired
private SmsService smsService;
}
像上面这种代码,在使用@Service的时候没有添加名字,直接使用@Autowired注入,当定义了另一个类后,SmsController就报错了。
如下所示,当代码中都是@Autowired后,你无法再实现SmsService定义另一类,那么这个SmsService的意义在哪?
多态,继承的意义在哪?
@Service("SmsLianTongService")
public class SmsLianTongService implements SmsService{}
@RestController
public class SmsController{
@Autowired
private SmsService smsService; //无法注入,运行报错
@Resource(name="SmsLianTongService")
private SmsService liantongService; //可以注入
}
最后总结
一、 设计模式是为了应对复杂模型而产生的,是为了代码易维护和扩展;
二、 不要为了强行匹配设计模式而设计,如果能简单设计,完全可以抛弃设计模式;
三、设计模式是Java抽象,封装,多态,反射的具体应用;
四、设计模式是一种设计思想,而不是固定的某种代码,并非一定要如上代码实现才是符合设计模式;
五、设计模式是可以嵌套的,有各自的共同点,也有不同点;
六、 设计模式中的对象可以是类,接口,方法,变量等;