设计模式~装饰模式

本文详细介绍了装饰模式的概念及其在软件设计中的应用。通过四个主要角色——抽象构建、具体构建、装饰角色及具体装饰角色的实现,展示了如何在不改变对象结构的前提下为对象添加新的职责。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装饰模式的构成:

1)    抽象构建角色(Component):给出一个抽象的接口,以规范准备接受附加责任的对象。相当于i/o流里面InputStream/OutputStreamReader/Writer

2)    具体的构建角色(ConcreteComponent):定义一个将要接受附加责任的类。相当于i/o里面的FileOutputStreamFileInputStream

3)    装饰角色(Docorator):持有一个抽象构建(Component)角色的引用,并定义一个与抽象构件一致的接口。相当于i/o里面的FilerOutputStream和       

       FilterInputStream

4)    具体的装饰角色(ConcreteDecorator):负责给构建对象“贴上”附加的责任。相当于i/o流里面的BufferedOutputStreamBufferedInputStream以及  

       DataOutputStreamDataInputSrtream

7.    装饰模式的特点:

1)    装饰对象和真实对象具有相同的接口,这样客户端对象就可以以真实对象的相同的方式和装饰对象交互。

2)    装饰对象包含一个真实对象的引用(reference).

3)    装饰对象接受所有来自客户端的请求,它把这些请求转发给真实的对象。

4)    装饰对象可以在转发这些请求以前或者以后增加一些附加的功能。这样就能确保在运行时,不用修改给定对象结构就可以在外部增加附加的功能。在面向对象的程序设计中,通常是使用继承的关系来扩展给定类的功能。

8.    案例:

1)    抽象的构建接口:

public interface Component{

   public void doSomething();

}

2)    具体的构建角色:

public class ConcreteComponent implements Component{

   @Override

   public void doSomething(){

      System.out.println("功能A");

   }

}

3)    装饰角色:

public class Decorate implements Component{

   private Component component;

   public Decorate(Component component){

      this.component = component;

   }

   @Override

   public void doSomething(){

      component.doSomething();

   }

}

4)    具体装饰角色1

public class ConcreteDecorate1 extends Decorate{

   public ConcreteDecorate1(Component component){

       super(component);

   }

   @Override

   public void doSomething(){

      super.doSomething();

      this.doAnotherDosomething();

   }

   private void doAnotherDosomething(){

      System.out.println("功能B");

   }

}

5)    具体装饰角色2

public class ConcreteDecorate2 extends Decorate{

   public ConcreteDecorate2(Component component) {

      super(component);

   }

   @Override

   public void doSomething(){

      super.doSomething();

      this.doAnotherDosomething();

   }

   private void doAnotherDosomething(){

      System.out.println("功能C");

   }

}

6)    客户端

public class Client{

   public static void main(String[] args) {

        Component component = new ConcreteDecorate1(

        new ConcreteDecorate2(new ConcreteComponent()));

        component.doSomething();

   }

}

运行结果:

功能A
功能C
功能B


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值