装饰模式

装饰模式(别名:包装器)

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

一 、 概述

装饰模式是动态地扩展一个对象的功能,而不需要改变原始类代码的一种成熟模式。在装饰模式中, 具体组件 类和 具体装饰 类是该模式中的最重要的两个角色。 

二、装饰模式模式的结构与使用 

装饰模式的结构中包括四种角色:

抽象组件( Component
具体组件( ConcreteComponent
装饰( Decorator
具体装饰( ConcreteDecotator


装饰模式的结构描述与使用

1.抽象组件 :Bird.java

public abstract class Bird{

   public abstract int fly();

}

2.具体组件 :Sparrow.java

public class Sparrow extends Bird{

   public final int DISTANCE=100;

   public int fly(){

      return DISTANCE;

   }

}

3.装饰 (Decorator:Decorator.java

public abstract class Decorator extendsBird{

   protected Bird bird;

   public Decorator(){

   }

   public Decorator(Bird bird){

      this.bird=bird;

   }

}

4具体装饰(ConcreteDecotator:SparrowDecorator.java

public class  SparrowDecorator extendsDecorator{

  public final int DISTANCE=50;       //eleFly方法能飞50

  SparrowDecorator(Birdbird){

     super(bird);

  }

  public int fly(){

     int distance=0;

     distance=bird.fly()+eleFly();

     return distance;

  }

  private inteleFly(){             //装饰者新添加的方法

     return DISTANCE;

  }

}

5.应用 Application.java

 public class Application{

   public void needBird(Birdbird){

       intflyDistance=bird.fly();

       System.out.println("这只鸟能飞行"+flyDistance +""); 

   }

   public static void main(String args[]){

      Application client=new Application();   

      Bird sparrow=new Sparrow();         

      Bird sparrowDecorator1=

      new SparrowDecorator(sparrow);      

      Bird sparrowDecorator2=

      new SparrowDecorator(sparrowDecorator1);

      client.needBird(sparrowDecorator1);

      client.needBird(sparrowDecorator2);               

  }

}

装饰模式的优点 
  被装饰者和装饰者是松耦合关系。由于装饰( Decorator )仅仅依赖于抽象组件( Component ),因此具体装饰只知道它要装饰的对象是抽象组件的某一个子类的实例,但不需要知道是哪一个具体子类。
 装饰模式满足 - 闭原则 。不必修改具体组件,就可以增加新的针对该具体组件的具体装饰。
 可以使用多个具体装饰来装饰具体组件的实例。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值