版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1052196521/article/details/79730856
问题提出
小明想要请个假,但由于种种原因不得不一直向上层层传递到总经理。设请假的级别为10。组长处理的级别为1~5,经理处理的级别为6~8,总经理处理的级别为9~10。用代码实现这个请假场景。
职责链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递改请求,直到有一个对象处理它为止。
package chainofresponsibility;
public class ChainOfResponsibility {
public static void main(String[] args) {
//初始化三个人
Manager leader = new Leader();
Manager director = new Director();
Manager boss = new Boss();
//设置彼此之间的上下级关系
leader.setSuperManager(director);
director.setSuperManager(boss);
//处理小明请假的事情 等级为10
leader.dealThings(10);
}
}
/**
* 管理者接口
*/
interface Manager {
//根据事情能级处理
void dealThings(int level);
void setSuperManager(Manager manager);
}
/**
* 组长
*/
class Leader implements Manager {
private Manager superManager;
//设置上级
@Override
public void setSuperManager(Manager manager) {
superManager = manager;
}
@Override
public void dealThings(int level) {
if (level < 5) {
System.out.println("组长成功处理事情");
} else {
//处理不了则上抛
superManager.dealThings(level);
}
}
}
/**
* 经理
*/
class Director implements Manager{
private Manager superManager;
//设置上级
@Override
public void setSuperManager(Manager manager) {
superManager = manager;
}
@Override
public void dealThings(int level) {
if (level < 8) {
System.out.println("经理成功处理事情");
} else {
//处理不了则上抛
superManager.dealThings(level);
}
}
}
class Boss implements Manager{
@Override
public void dealThings(int level) {
System.out.println("总经理成功处理事情");
}
@Override
public void setSuperManager(Manager manager) {
System.out.println("boss无上级");
}
}
输出:
总经理成功处理事情
其实我感觉职责链模式的设计和装饰模式有很多相似之处:都是定义一个接口然后在子类中保留该接口的引用。在deal()方法中调用这个引用的deal()方法。
只不过这两者定义不同。装饰模式侧重在原实现类的基础上进行其他实现类的层层包装,而职责链模式则侧重于自己是否该处理这个请求。处理不了才抛给另外一个实现类进行处理。
plantuml
@startuml
interface Manager{
{abstract}dealThings(int level);
{abstract}setSuperManager(Manager manager);
}
Manager <..* Leader
Manager <|.. Leader
class Leader{
Manager superManager
dealThings(int level);
setSuperManager(Manager manager);
}
Manager <..* Director
Manager <|.. Director
class Director{
Manager superManager
dealThings(int level);
setSuperManager(Manager manager);
}
Manager <..* Boss
Manager <|.. Boss
class Boss{
Manager superManager
dealThings(int level);
setSuperManager(Manager manager);
}
@enduml