电子商务网站运营与...,网站建设模板图片,厦门建站服务,手机版网站开发人员选项责任链模式#xff1a;和上一篇策略模式一样也是行为型模式。创建一个接收者对象的链。这种模式给予请求的类型#xff0c;对请求的发送者和接收者进行解耦。这种模式中#xff0c;通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求#xff0c;那么它…责任链模式和上一篇策略模式一样也是行为型模式。创建一个接收者对象的链。这种模式给予请求的类型对请求的发送者和接收者进行解耦。这种模式中通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求那么它会把相同的请求传给下一个接收者依此类推。
介绍
意图避免请求发送者与接收者耦合在一起让多个对象都有可能接收请求将这些对象连接成一条链并且沿着这条链传递请求直到有对象处理它为止。主要解决问题客户只需要将请求发送到职责链上即可无须关心请求的处理细节和请求的传递总的来说就是职责链将请求的发送者和请求的处理者解耦。关键代码抽象类里面聚合它自己聚合和抽象类我在设计模式的六大原则-CSDN博客有介绍和示例在里面判断是否满足条件如果没达到条件则向下传递。优点1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。缺点1、不能保证请求一定被接收。 2、系统性能将受到一定影响而且在进行代码调试时不太方便可能会造成循环调用。 3、可能不容易观察运行时的特征有碍于除错。
还这个绘制三角形、圆形、矩形图案例子 创建抽象的绘制类。 public abstract class AbstractDraw {public static String TRIANGLE 三角形;public static String CIRCULAR 圆形;public static String RECTANGLE 矩形;protected String shape;//责任链中的下一个接收者protected AbstractDraw nextDraw;public void setNextDraw(AbstractDraw nextDraw){this.nextDraw nextDraw;}public void draw(String shape, String colour){if(this.shape.equals(shape)){drawing(colour);}if(nextDraw !null){nextDraw.draw(shape, colour);}}abstract protected void drawing(String colour);} 创建扩展该绘制类的 三角形责任实体类 public class TriangleDraw extends AbstractDraw{public TriangleDraw(String shape) {this.shape shape;}Overrideprotected void drawing(String colour) {//绘制一个colour颜色的三角形逻辑}
} 圆形责任实体类 public class CircularDraw extends AbstractDraw{public CircularDraw(String shape) {this.shape shape;}Overrideprotected void drawing(String colour) {//绘制一个colour颜色的圆形逻辑}
} 矩形责任实体类 public class RectangleDraw extends AbstractDraw{public RectangleDraw(String shape) {this.shape shape;}Overrideprotected void drawing(String colour) {//绘制一个colour颜色的距形逻辑}
}创建不同类型的责任编排成链 public class ChainPatternDemo {//编排成链static AbstractDraw getChainOfDraw(){AbstractDraw triangleDraw new TriangleDraw(AbstractDraw.TRIANGLE);AbstractDraw circularDraw new CircularDraw(AbstractDraw.CIRCULAR);AbstractDraw rectangleDraw new RectangleDraw(AbstractDraw.RECTANGLE);triangleDraw.setNextDraw(circularDraw);circularDraw.setNextDraw(rectangleDraw);return triangleDraw;}//使用示例public static void main(String[] args) {AbstractDraw drawChain getChainOfDraw();drawChain.draw(AbstractDraw.TRIANGLE,红色);drawChain.draw(AbstractDraw.CIRCULAR,蓝色);drawChain.draw(AbstractDraw.RECTANGLE,绿色);}
}