设计模式责任链模式

编程

设计模式-责任链模式

定义

使多个对象都有机会处理请求,避免请求发送者和接受者之间的耦合关系,将接收者对象组成一条链,并沿着这条链处理请求,直到处理

请求中的某个接受者返回(也包含无下一个接受者的情况)

UML

假设有一个根据不同等级的会员发送卡券包的需求

优点

  1. 将请求和处理分开,请求无须知道处理的细节,处理不用知道请求的全貌,两者解耦,提高功能或系统的灵活性

  2. 能够动态的变更(增加、删除、改变顺序)接受者,易扩展

缺点

  1. 接受者的链路过长导致性能问题以及调试问题

实现

  • 定义了会员以及会员等级的枚举

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时检查是否超出阈值,以确保链条的长度再可控范围内

使用场景

  1. 多个对象处理同一个请求,具体怎么处理,谁来处理又运行时决定
  2. 不明确指定接受者的情况,向一组接受者发送请求
  3. 动态指定一组对象处理请求

以上是 设计模式责任链模式 的全部内容, 来源链接: utcz.com/z/512357.html

回到顶部