链式设计模式
链式编程是一种将多个方法调用连在一起的编程风格。在链式编程中,每个方法的返回值都是一个对象,可以继续调用该对象的其他方法。这种方式使得代码看起来更加流畅,减少了临时变量的使用,提高了代码的可读性和可维护性。
链式编程的特点有以下几点:
-
每个方法的返回值都是一个对象,可以继续调用该对象的其他方法。
-
方法的调用顺序可以任意调整,只要保证方法之间的依赖关系正确即可。
-
链式编程可以嵌套使用,即在一个方法中调用另一个方法,形成多层的链式调用。
public class Person {private String firstName;private String lastName;private int age;public Person setFirstName(String firstName) {this.firstName = firstName;return this;}public Person setLastName(String lastName) {this.lastName = lastName;return this;}public Person setAge(int age) {this.age = age;return this;}
}class Test {public static void main(String[] args) {Person person = new Person();person.setFirstName("1").setLastName("2").setAge(3).setFirstName("4");}
}
链式设计模式的具体体现:
1.装饰模式
动态地给一个对象增加一些额外的职责(方法),就增加对象功能来说,装饰模式比生成子类更为灵活。
装饰模式包含以下四个角色:
(1)Component(抽象构件):定义了对象的接口,可以给这些对象动态增加职责(方法)。它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法。
(2)ConcreteComponent(具体构件):定义了具体的构件对象,实现了在抽象构件中声明的方法,装饰器可以给它增加额外的职责(方法)。
(3)Decorator(抽象装饰类):是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现。它维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到装饰的目的。
(4)ConcreteDecorator(具体装饰类):是抽象装饰类的子类,负责向构件添加新的职责。每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法以便扩充对象的行为。
特点与优势
-
动态组合对象功能:装饰模式可以在运行时动态地组合对象的功能,而不需要在编译时确定对象的组合方式。这使得系统更加灵活,可以根据需要组合不同的对象来实现不同的功能。
-
避免大量子类:使用装饰模式可以避免通过继承来扩展功能时产生的大量子类,从而简化了类的层次结构。
-
符合开闭原则:装饰模式可以在不修改原有类代码的情况下,通过添加新的装饰类来扩展功能,符合开闭原则(对扩展开放,对修改关闭)。
注意事项:
避免过度使用:装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。因此,在使用装饰模式时需要权衡其带来的灵活性和复杂性。
2.职责链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
责任链模式主要包含以下几个角色:
-
抽象处理者(Handler)角色:定义一个处理请求的接口,并持有对下一个处理者的引用。
-
具体处理者(Concrete Handler)角色:实现抽象处理者的接口,处理它所负责的请求。如果它不能处理该请求,则可以把请求传给下一个处理者。
优缺点
优点:
-
链路结构灵活:可以通过改变链路结构动态地新增或删减责任。
-
易扩展:可以根据需要增加新的请求处理类,满足开闭原则。
-
责任分担:每个类只需要处理自己该处理的工作,明确各类的责任范围,符合类的单一职责原则。
缺点:
-
性能问题:责任链太长或者处理时间过长,会影响整体性能。
-
循环引用问题:如果节点对象存在循环引用时,会造成死循环,导致系统崩溃。
适用场景
责任链模式适用于以下场景:
-
当有多个对象可以处理同一个请求时。
-
当处理者之间的顺序不确定时,可以动态组织处理者之间的顺序。
-
当请求的处理流程需要灵活配置时。