Java中深入浅析的装饰器

  介绍

深入浅析Java中的装饰器?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

动态给一个对象添加一些额外的职责,就象在墙上刷油漆。使用装饰模式相比用生成子类方式达到功能的扩充显得更为灵活。设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的只


装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为

实际上Java的I/O API就是使用装饰实现的。

//定义被装饰者
  人类{公共接口
  公共空间wearClothes ();
  公共空间walkToWhere ();
  }//定义装饰者
  公共抽象类装饰器实现人类{
  私人人类人类;
  公共装饰(人类人类){
  这一点。人类=人类;
  }
  公共空间wearClothes () {
  human.wearClothes ();
  }
  公共空间walkToWhere () {
  human.walkToWhere ();
  }
  }//下面定义三种装饰,这是第一个,第二个第三个功能依次细化,即装饰者的功能越来越多
  公开课Decorator_zero延伸装饰{
  公共Decorator_zero(人类人类){
  超级(人类);
  }
  公共空间转转(){
  System.out.println(“进房子。“);
  }
  公共空间findMap () {
  System.out.println(“书房找找地图。“);
  }
  @Override
  公共空间wearClothes () {//TODO自动生成方法存根
  super.wearClothes ();
  转转();
  }
  @Override
  公共空间walkToWhere () {//TODO自动生成方法存根
  super.walkToWhere ();
  findMap ();
  }
  }
  公开课Decorator_first延伸装饰{
  公共Decorator_first(人类人类){
  超级(人类);
  }
  公共空间goClothespress () {
  System.out.println(“去衣柜找找看。“);
  }
  公共空间findPlaceOnMap () {
  System.out.println(“在地图上找找。“);
  }
  @Override
  公共空间wearClothes () {//TODO自动生成方法存根
  super.wearClothes ();
  goClothespress ();
  }
  @Override
  公共空间walkToWhere () {//TODO自动生成方法存根
  super.walkToWhere ();
  findPlaceOnMap ();
  }
  }
  公开课Decorator_two延伸装饰{
  公共Decorator_two(人类人类){
  超级(人类);
  }
  公共空间findClothes () {
  System.out.println(“找到一件D& G . .“);
  }
  公共空间findTheTarget () {
  System.out.println(“在地图上找到神秘花园和城堡。“);
  }
  @Override
  公共空间wearClothes () {//TODO自动生成方法存根
  super.wearClothes ();
  findClothes ();
  }
  @Override
  公共空间walkToWhere () {//TODO自动生成方法存根
  super.walkToWhere ();
  findTheTarget ();
  }
  }//定义被装饰者,被装饰者初始状态有些自己的装饰
  公共类人实现人类{
  @Override
  公共空间wearClothes () {//TODO自动生成方法存根
  System.out.println(“穿什么呢…“);
  }
  @Override
  公共空间walkToWhere () {//TODO自动生成方法存根
  System.out.println(“去哪里呢。“);
  }
  }//测试类,看一下你就会发现,跟java I/O的操作有多么相似
  公共类测试{
  公共静态void main (String [] args) {
  人类人=new ();
  修饰符修饰符=new Decorator_two(新Decorator_first (
  新Decorator_zero(人)));
  decorator.wearClothes ();
  decorator.walkToWhere ();
  }
  }

运行结果:,

深入浅析Java中的装饰器

其实就是进房子找衣服,然后找地图这样一个过程,通过装饰者的三层装饰,把细节变得丰富。

1, Decorator抽象类中,持有人类接口,方法全部委托给该接口调用,目的是交给该接口的实现类即子类进行调用。

2, Decorator抽象类的子类(具体装饰者),里面都有一个构造方法调用超级(人类),这一句就体现了抽象类依赖于子类实现即抽象依赖于实现的原则。因为构造里面参数都是人类接口,只要是该人类的实现类都可以传递进去,即表现出装饰dt=new Decorator_second(新Decorator_first(新Decorator_zero(人类))),这种结构的样子,所以当调用dt.wearClothes (); dt.walkToWhere()的时候,又因为每个具体装饰者类中,都先调用super.wearClothes和super.walkToWhere()方法,而该超级已经由构造传递并指向了具体的某一个装饰者类(这个可以根据需要调换顺序),那么调用的即为装饰类的方法,然后才调用自身的装饰方法,即表现出一种装饰,链式的类似于过滤的行为。

Java中深入浅析的装饰器