链式设计模式:装饰模式,职责链模式
1.什么是链式设计模式
将多个对象或类串联起来,自上向下/由外向内遍历,直到满足条件或遍历结束,这种模式我们称为链式模式。
2.装饰模式
不改变对象接口的情况下,动态的给一个对象添加一些额外的功能。
2.1核心概念
Component:定义一个抽象的接口或类,所有的具体组件类和装饰器类都实现或继承这个接口或类。
ConcreteComponent:具体的组件类,实现了Component接口。
Decorator:装饰器类,也实现了Component接口,并持有一个Component对象的引用。通过委托调用Component对象的方法,并在必要时添加额外的行为。
ConcreteDecorator:具体的装饰器类,继承自Decorator类,并在其中添加新的行为或职责。
2.2优点
1)动态扩展功能:允许在运动时动态的为对象添加新的功能。
2)符合开闭原则:添加新功能时不需要改原有代码。
3)透明性:装饰对象和被装饰对象可以相互替换,对客户透明。
4)灵活性:耦合度低,也可以通过不同装饰器实现不同组合。
2.3弊端
1)复杂性增加:可能过度设计,创建多个装饰器类,增加代码复杂度。
2)不易调试:多层嵌套的话可能导致调试困难。
2.4简单代码演示
public abstract class Role { public abstract String getName(); }
public class Roles extends Role { String name = "小明"; @Override public String getName() { return name; } }
public abstract class DressUp extends Role { Role role; public abstract String getName(); }
public class Clothes extends DressUp { Role role; public Clothes(Role role){ this.role = role; } @Override public String getName() { return role.getName()+"穿衣服"; } }
Role role; public Pants(Role role){ this.role=role; } @Override public String getName() { return role.getName()+"穿裤子"; } }
public class Test { public static void main(String[] args) { Roles roles = new Roles(); System.out.println(roles.getName()); Clothes clothes = new Clothes(roles); System.out.println(clothes.getName()); Pants pants = new Pants(roles); System.out.println(pants.getName()); Pants pants1 = new Pants(clothes); System.out.println(pants1.getName()); } }
测试结果:
3.职责链模式
使多个对象都有机会处理请求,避免请求发送者与接收者之间的耦合关系。
3.1核心概念
Handler(处理者):定义一个处理请求的接口,通常包含一个指向下一个处理者的引用。
ConcreteHandler(具体处理者):实现处理者接口,具体处理请求。每个具体处理者决定是否处理请求,以及是否将请求传递给链中的下一个处理者。
Client(客户端):创建处理者对象,并将它们组织成一条链。
3.2优点
1)动态配置:允许在运动时动态的为对象添加或删除处理者。
2)符合开闭原则:添加新功能时不需要改原有代码。
3)责任明确:每个处理者只负责处理特定请求。
4)多级处理:请求可以在多个处理者之间传递。
4)灵活性:发送者和处理者之间解耦。
3.3弊端
1)性能问题:如果职责链过长,请求可能需要经过多个处理者,增加了处理时间。
2)调试困难:请求在多个处理者之间传递,可能导致调试和追踪请求处理过程的难度增加。