装饰器设计模式

装饰者模式其实就是添加附加功能的一种方式。就是说一个类已经有了基本功能,那么添加额外的功能要怎么添加才比较好。一般情况的话,你可以在该类中添加一个方法,然后在调用原来的方法之前或者之后调用,那么就相当于进行相应的装饰。这种方式不太好的方面是就是违反开闭原则。还有进行不够灵活,比如要各种装饰的搭配也不好解决。装饰模式可以通过多态的方式来解决这种问题,而且可以自由搭配。

注意装饰器不可以单独使用,它必须指定一个装饰器或者一个实际的被装饰的对象。

比如这里SwimDecorator和FlyDecorator都是装饰器,都有一个非空的构造器,必须指定装饰器或者是实际的被装饰对象(ConreteA也需要实现Decorator)。最终的闭环是实际的被装饰对象,而不是装饰类。

Decorator:

package cn.yishijie;
​
public interface Decorator {
​
    void decorator();
}

 

ConcreteA:

package cn.yishijie;
​
public class ConcreteA implements Decorator {
​
    @Override
    public void decorator() {
        System.out.println("concreteA ...");
    }
}

 

SwimDecorator:

package cn.yishijie;
​
public class FlyDecorator implements Decorator {
​
    private Decorator decorator;
    public FlyDecorator(Decorator decorator) {
        this.decorator = decorator;
    }
​
    @Override
    public void decorator() {
        decorator.decorator();
        System.out.println("add fly function...");
    }
}

 

FlyDocorator:

package cn.yishijie;
​
public class SwimDecorator implements Decorator {
​
    private Decorator decorator;
​
    public SwimDecorator(Decorator decorator) {
        this.decorator = decorator;
    }
​
    @Override
    public void decorator() {
        decorator.decorator();
        System.out.println("add swim function...");
    }
}

 

Client:

package cn.yishijie;
​
public class Client  {
​
    public static void main(String[] args) {
        ConcreteA concreteA = new ConcreteA();
        concreteA.decorator();
        FlyDecorator flyDecorator = new FlyDecorator(concreteA);
        flyDecorator.decorator();
        SwimDecorator swimDecorator = new SwimDecorator(flyDecorator);
        swimDecorator.decorator();
    }
}

可以发现,这个装饰的作用可以随意搭配,就是各种装饰对象都是相互当作被装饰的对象。比如ConreateA需要相应的额外功能就可以添加一个装饰类,而且这个装饰类还可以复用,组成不同的组合。比如这里SwimDecorator和FlyDecorator都可以和ConcreteA搭配使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值