设计模式简介
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
责任链模式
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
优点:
- 降低耦合度。它将请求的发送者和接收者解耦。
- 简化了对象。使得对象不需要知道链的结构。
- 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
- 增加新的请求处理类很方便。
缺点:
- 不能保证请求一定被接收。
- 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
- 可能不容易观察运行时的特征,有碍于除错。
使用场景:
- 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
- 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可动态指定一组对象处理请求。
实例
公司中的公告需要逐级通知,非常适合 责任链模式
公司的抽象类
public abstract class Company {
public static int administrative = 1;//行政
public static int department = 2;//部门
public static int personage = 3;//个人
protected int level = 0;
protected Company nextDepartment;//下一个部门
public void notify(int level,String msg) {
if(this.level <= level) {
notifySuccess(msg);
}
if(nextDepartment != null) {
nextDepartment.notify(level, msg);
}
}
public void notifySuccess(String msg) {};
}
行政,部门,个人分别通知
public class Administrative extends Company{
public Administrative() {
this.level = 1;
}
public void notifySuccess(String msg) {
System.out.println("行政已经收到通知【"+msg+"】");
}
}
public class Department extends Company{
public Department() {
this.level = 2;
}
public void notifySuccess(String msg) {
System.out.println("部门已经收到通知【"+msg+"】");
}
}
public class Personage extends Company{
public Personage() {
this.level = 3;
}
public void notifySuccess(String msg) {
System.out.println("我已经收到通知【"+msg+"】");
}
}
构建责任链级别然后调用
public static Company getCompany() {
Company administrative = new Administrative();
Company department = new Department();
Company personage = new Personage();
administrative.nextDepartment = department;
department.nextDepartment = personage;
return administrative;
}
public static void main(String[] args) {
Company company = getCompany();
company.notify(3, "这条通知要通知到个人");
System.out.println("================");
company.notify(2, "这条通知只通知到部门");
}
行政已经收到通知【这条通知要通知到个人】
部门已经收到通知【这条通知要通知到个人】
我已经收到通知【这条通知要通知到个人】
================
行政已经收到通知【这条通知只通知到部门】
部门已经收到通知【这条通知只通知到部门】