JAVA设计模式——装饰模式

装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

装饰模式是为已有功能动态地添加更多功能的一种方式,当系统需要新功能的时候,是向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要,而装饰模式提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地舒勇装饰功能包装对象了。

优点:有效地把类的核心职责和装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑。

这里写图片描述

一个装饰接口,有一个具体实现类,当需要对这个实现类进行一些特殊情况下的扩充装饰时,不应直接修改实现类,提供一个装饰类实现装饰接口,含有有装饰接口的属性,有多个具体的装饰类去继承该装饰类,在装饰类里对该装饰接口进行装饰。

/**
* 装饰接口
*/
public interface Component {
public void build();
}

/**
* 具体实现类
*/
public class ConcretComponenet implements Component {
@Override
public void build() {
System.out.println(“具体实现”);
}
}

/**
* 装饰类
*/
public class Decorator implements Component {
public Component component;
public Decorator() {
}
public Decorator(Component component) {
this.component = component;
}
@Override
public void build() {
this.component.build();
}
}

/**
* 具体装饰类A
*/
public class DecoratorComponentA extends Decorator {
public DecoratorComponentA(Component component) {
super(component);
}
@Override
public void build() {
System.out.println(“A类装饰”);
this.component.build();
}
}

/**
* 具体装饰类B
*/
public class DecoratorComponentB extends Decorator {
private String s;
public DecoratorComponentB() {
super();
}
public DecoratorComponentB(Component component) {
super(component);
}
public DecoratorComponentB(Component component, String s) {
super(component);
this.s = s;
}
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
@Override
public void build() {
System.out.println(“B类实现装饰方法” + this.s);
this.component.build();
}
}

public class Main {
public static void main(String[] args){
// Component component = new DecoratorComponentA((new ConcretComponenet()));
// component.build(); //进行了A类的装饰
// Component component1 = new DecoratorComponentB(component,”a”);
// component1.build(); //在A类装饰的基础上进行了B类的装饰
Component component = new DecoratorComponentA(new DecoratorComponentB(new ConcretComponenet(),”a”));
component.build();
}
}

扫描二维码关注公众号,回复: 2799189 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_36997245/article/details/81711722