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();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值