设计模式责任链模式
设计模式-责任链模式
定义
使多个对象都有机会处理请求,避免请求发送者和接受者之间的耦合关系,将接收者对象组成一条链,并沿着这条链处理请求,直到处理请求中的某个接受者返回(也包含无下一个接受者的情况)
UML
假设有一个根据不同等级的会员发送卡券包的需求
优点
将请求和处理分开,请求无须知道处理的细节,处理不用知道请求的全貌,两者解耦,提高功能或系统的灵活性
能够动态的变更(增加、删除、改变顺序)接受者,易扩展
缺点
- 接受者的链路过长导致性能问题以及调试问题
实现
- 定义了会员以及会员等级的枚举
public class Member {
public Member(String name, MemberLevel memberLevel) {
this.name = name;
this.memberLevel = memberLevel;
}
private String name;
private MemberLevel memberLevel;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public MemberLevel getMemberLevel() {
return memberLevel;
}
public void setMemberLevel(MemberLevel memberLevel) {
this.memberLevel = memberLevel;
}
@Override
public String toString() {
return "Member{" +
"name="" + name + """ +
", memberLevel=" + memberLevel +
"}";
}
}
public enum MemberLevel { /**
* 钻石
*/
DIAMOND(100),
/**
* 黄金
*/
GOLD(90),
/**
* 白银
*/
SILVER(80),
/**
* 青铜
*/
BRONZE(70);
private Integer level;
MemberLevel(int level){
this.level = level;
}
public int getLevelValue(){
return this.level;
}
}
- 抽象卡券助手java
public abstract class AbstractCouponAssistant { protected Integer memberLevel;
protected AbstractCouponAssistant nextCouponAssistant;
protected void setNext(AbstractCouponAssistant couponAssistant) {
this.nextCouponAssistant = couponAssistant;
}
public void sendCoupon(Member member){
if(member.getMemberLevel().getLevelValue() >= memberLevel){
this.addCouponToPackage(member);
}
if(nextCouponAssistant != null){
nextCouponAssistant.sendCoupon(member);
}
}
/**
* 增加卡券到卡包
* @param member
*/
protected abstract void addCouponToPackage(Member member) ;
}
- 具体的卡券助手
public class DiamondCouponAssistant extends AbstractCouponAssistant {
public DiamondCouponAssistant(Integer memberLevel) {
this.memberLevel = memberLevel;
}
@Override
protected void addCouponToPackage(Member member) {
System.out.println("为会员 {" + member.toString() + "}增加 钻石卡券");
}
}
public class GoldCouponAssistant extends AbstractCouponAssistant { public GoldCouponAssistant(Integer memberLevel){
this.memberLevel = memberLevel;
}
@Override
protected void addCouponToPackage(Member member) {
System.out.println("为会员 {" + member.toString() + "}增加 黄金卡券");
}
}
public class SilverCouponAssistant extends AbstractCouponAssistant { public SilverCouponAssistant(Integer memberLevel) {
this.memberLevel = memberLevel;
}
@Override
protected void addCouponToPackage(Member member) {
System.out.println("为会员 {" + member.toString() + "}增加 白银卡券");
}
}
public class BronzeCouponAssistant extends AbstractCouponAssistant { public BronzeCouponAssistant(Integer memberLevel) {
this.memberLevel = memberLevel;
}
@Override
protected void addCouponToPackage(Member member) {
System.out.println("为会员 {" + member.toString() + "}增加 青铜卡券");
}
}
- 调用client
public class ChainPatternDenoClient { public static void main(String[] args) {
AbstractCouponAssistant couponAssistant = getCouponAssistantChain();
Member diamondMember = new Member("钻石王", MemberLevel.DIAMOND);
Member goldMember = new Member("黄金张", MemberLevel.GOLD);
Member silverMember = new Member("白银黄", MemberLevel.SILVER);
Member bronzeMember = new Member("青铜吴", MemberLevel.BRONZE);
System.out.println("开始发送卡券");
couponAssistant.sendCoupon(diamondMember);
System.out.println("=====发送下一个====");
couponAssistant.sendCoupon(goldMember);
System.out.println("=====发送下一个====");
couponAssistant.sendCoupon(silverMember);
System.out.println("=====发送下一个====");
couponAssistant.sendCoupon(bronzeMember);
}
private static AbstractCouponAssistant getCouponAssistantChain() {
DiamondCouponAssistant diamondCouponAssistant = new DiamondCouponAssistant(MemberLevel.DIAMOND.getLevelValue());
GoldCouponAssistant goldCouponAssistant = new GoldCouponAssistant(MemberLevel.GOLD.getLevelValue());
SilverCouponAssistant silverCouponAssistant = new SilverCouponAssistant(MemberLevel.SILVER.getLevelValue());
BronzeCouponAssistant bronzeCouponAssistant = new BronzeCouponAssistant(MemberLevel.BRONZE.getLevelValue());
diamondCouponAssistant.setNext(goldCouponAssistant);
goldCouponAssistant.setNext(silverCouponAssistant);
silverCouponAssistant.setNext(bronzeCouponAssistant);
return diamondCouponAssistant;
}
}
扩展
控制责任链的长度,一般在抽象的的接受者设置一个阈值,执行setNext时检查是否超出阈值,以确保链条的长度再可控范围内
使用场景
- 多个对象处理同一个请求,具体怎么处理,谁来处理又运行时决定
- 不明确指定接受者的情况,向一组接受者发送请求
- 动态指定一组对象处理请求
以上是 设计模式责任链模式 的全部内容, 来源链接: utcz.com/z/512357.html