Design|策略模式 + 责任链模式 + 组合转发练习
/**
* @author yaoqiang
* @create 2018-12-12 23:40
* @desc 员工信息
**/
@Data
public class Employee {
private int id;
private String name;
private int score;
}
/**
* @author yaoqiang
* @create 2018-12-12 23:35
* @desc 请求,请假单信息
**/
@Data
public class Request {
private int id;
private StringBuilder context;
private Employee employee;
private String reason;
private int day;
}
/**
* @author yaoqiang
* @create 2018-12-12 23:37
* @desc 领导抽象
**/
public abstract class Leader {
private final EmployeeStrategy strategy;
private Leader next;
public Leader(EmployeeStrategy strategy){
this.strategy = strategy;
}public Leader setNext(Leader l){
next = l;
return this;
}public boolean check(Request r){
boolean result = strategy.yesOrNo(r);
if(result) {
writeSuccessMessage(r.getContext());
return next.check(r);
}else{
writeFailMessage(r.getContext());
return false;
}}privatevoid writeSuccessMessage(StringBuilder builder){
builder.append(getClass() + strategy.getSuccessReson());
}privatevoid writeFailMessage(StringBuilder builder){
builder.append(getClass() + strategy.getFailReson());
}
}
/**
* @author yaoqiang
* @create 2018-12-12 23:40
* @desc 请求策略接口
**/
public interface EmployeeStrategy {boolean yesOrNo(Request r);
String getSuccessReson();
String getFailReson();
}
public enum EmployeeStrategyEnums implements EmployeeStrategy{
MANAGER(Type.BAD),
GROUP_LEADER(Type.NOMAL);
private final EmployeeStrategy strategy;
EmployeeStrategyEnums(EmployeeStrategy strategy){
this.strategy =strategy;
}@Override
public boolean yesOrNo(Request r){
return strategy.yesOrNo(r);
}@Override
public String getSuccessReson() {
return strategy.getSuccessReson();
}@Override
publicString getFailReson(){
return strategy.getFailReson();
}enum Type implements EmployeeStrategy{
NOMAL{
@Override
public boolean yesOrNo(Request r) {
return r.getEmployee().getScore() > 70 && r.getDay() < 7?true:false;
}@Override
public String getFailReson() {
return "分数不到70,天数超过6天";
}
},
BAD{
@Override
public boolean yesOrNo(Request r) {
return r.getEmployee().getScore() > 90 && r.getDay() < 7?true:false;
}@Override
public String getFailReson() {
return "分数不到90,天数超过6天";
}
};
@Override
public abstract boolean yesOrNo( Request r);
@Override
public String getSuccessReson() {
return "同意,早去早回";
}@Override
public abstract String getFailReson();
}}
/**
* @author yaoqiang
* @create 2018-12-12 23:52
* @desc 组长
**/
public class GroupLeader extends Leader {public GroupLeader(EmployeeStrategy strategy) {
super(strategy);
}}
/**
* @author yaoqiang
* @create 2018-12-12 23:56
* @desc 经理
**/
public class Manager extends Leader{public Manager(EmployeeStrategy strategy) {
super(strategy);
}}
/**
* @author yaoqiang
* @create 2018-12-13 0:18
* @desc demo
**/
public class Demo {
public static void main(String[] args) {
Leader l = new GroupLeader(GROUP_LEADER).setNext(new Manager(MANAGER));
Request r = new Request();
Employee e = new Employee();
e.setId(123);
e.setName("张三");
e.setScore(80);
r.setDay(6);
r.setId(1);
r.setReason("事假");
r.setEmployee(e);
r.setContext(new StringBuilder("有事"));
boolean result = l.check(r);
if(result)
System.out.println("success" + r.getContext());
else
System.out.println("fail" + r.getContext());
}
}
【Design|策略模式 + 责任链模式 + 组合转发练习】
推荐阅读
- 硬笔楷书26
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- 设计模式-代理模式-Proxy
- 【译】Rails|【译】Rails 5.0正式发布(Action Cable,API模式等)
- java静态代理模式
- VueX(Vuex|VueX(Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式)
- [译文]Domain|[译文]Domain Driven Design Reference(四)—— 柔性设计
- Kotlin基础(10)-代理模式在kotlin中的使用
- 长谈的确是这个时代需要的一种模式
- 《读_Head_First_有感》_“命令模式”