设计模式 -- 责任链模式(Chain of Responsibility Pattern)
责任链模式:和上一篇策略模式一样也是行为型模式。创建一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
介绍
意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
主要解决问题:客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,总的来说就是职责链将请求的发送者和请求的处理者解耦。
关键代码:抽象类里面聚合它自己(聚合和抽象类我在设计模式的六大原则-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;
}
@Override
protected void drawing(String colour) {
//绘制一个colour颜色的三角形逻辑
}
}
圆形责任实体类
public class CircularDraw extends AbstractDraw{
public CircularDraw(String shape) {
this.shape = shape;
}
@Override
protected void drawing(String colour) {
//绘制一个colour颜色的圆形逻辑
}
}
矩形责任实体类
public class RectangleDraw extends AbstractDraw{
public RectangleDraw(String shape) {
this.shape = shape;
}
@Override
protected 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,"绿色");
}
}
————————————————
版权声明:本文为CSDN博主「小铁-Android」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_50675668/article/details/134292746
介绍
意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
主要解决问题:客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,总的来说就是职责链将请求的发送者和请求的处理者解耦。
关键代码:抽象类里面聚合它自己(聚合和抽象类我在设计模式的六大原则-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;
}
@Override
protected void drawing(String colour) {
//绘制一个colour颜色的三角形逻辑
}
}
圆形责任实体类
public class CircularDraw extends AbstractDraw{
public CircularDraw(String shape) {
this.shape = shape;
}
@Override
protected void drawing(String colour) {
//绘制一个colour颜色的圆形逻辑
}
}
矩形责任实体类
public class RectangleDraw extends AbstractDraw{
public RectangleDraw(String shape) {
this.shape = shape;
}
@Override
protected 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,"绿色");
}
}
————————————————
版权声明:本文为CSDN博主「小铁-Android」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_50675668/article/details/134292746
本站大部分文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了您的权益请来信告知我们删除。邮箱:1451803763@qq.com