设计模式装饰模式_第1页
设计模式装饰模式_第2页
设计模式装饰模式_第3页
设计模式装饰模式_第4页
设计模式装饰模式_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

设计模式装饰模式《设计模式装饰模式》篇一装饰模式(DecoratorPattern)是一种设计模式,它允许在不改变原有对象的基础上,通过增加额外的行为或责任来扩展对象的功能。这种模式提供了一种灵活的方式来动态地给对象添加职责,使得功能扩展非常方便。装饰模式的核心思想是“对象结构”的组合,它将对象组合成树状结构,以表示“部分-整体”的层次结构。装饰模式的主要优点在于它保持了对象的一致性,因为所有装饰对象和被装饰对象都遵循相同的接口。这使得客户端可以透明地使用装饰对象,而无需知道装饰的细节。此外,装饰模式还支持动态扩展,因为可以在运行时决定是否添加装饰以及添加哪些装饰。装饰模式通常由三部分组成:1ponent(组件):这是装饰模式中的抽象组件,它定义了一个接口,所有具体的组件和装饰对象都必须实现这个接口。2.ConcreteComponent(具体组件):这是组件的实现类,它提供了具体的业务逻辑。3.Decorator(装饰器):这是一个抽象类或接口,它定义了如何装饰组件的行为。Decorator持有Component的引用,并可以添加额外的行为。在实际应用中,装饰模式可以用来构建一个复杂的对象结构,例如在创建一个图形用户界面(GUI)时,可以通过装饰模式来动态地添加或移除组件,如按钮、文本框等。此外,在软件设计中,装饰模式还可以用来实现日志记录、异常处理、性能监控等功能,而不需要改变原有的代码逻辑。下面是一个简单的装饰模式示例,展示了如何在不改变“咖啡”类的情况下,通过装饰器来添加不同的调料:```java//组件接口interfaceCoffee{voidbrew();}//具体的组件类classBlackCoffeeimplementsCoffee{@Overridepublicvoidbrew(){System.out.println("Blackcoffeeisbrewing...");}}//装饰器接口interfaceCoffeeDecoratorextendsCoffee{voidaddCondiments();}//具体的装饰器类classMilkDecoratorextendsCoffeeDecorator{privateCoffeecoffee;publicMilkDecorator(Coffeecoffee){this.coffee=coffee;}@Overridepublicvoidbrew(){coffee.brew();}@OverridepublicvoidaddCondiments(){System.out.println("Addingmilk...");}}//客户端代码publicclassDecoratorPatternDemo{publicstaticvoidmain(String[]args){CoffeeblackCoffee=newBlackCoffee();blackCoffee.brew();CoffeecoffeeWithMilk=newMilkDecorator(blackCoffee);coffeeWithMilk.addCondiments();coffeeWithMilk.brew();}}```在这个例子中,`BlackCoffee`是一个具体组件,`MilkDecorator`是一个装饰器,它持有`BlackCoffee`的引用,并在`BlackCoffee`的基础上添加了牛奶这一调料。客户端可以通过`MilkDecorator`来创建含有牛奶的咖啡,而无需改变`BlackCoffee`的代码。装饰模式在实际开发中非常有用,它鼓励“开闭原则”,即软件应该对扩展开放,对修改关闭。通过使用装饰模式,我们可以很容易地添加新的功能,同时保持原有代码的稳定性和可维护性。《设计模式装饰模式》篇二在软件设计中,装饰模式(DecoratorPattern)是一种常用的设计模式,它允许在运行时动态地给对象添加功能。这种模式的核心思想是保持接口的稳定性,通过在已有对象上添加装饰对象来扩展功能,而不是直接修改原对象或继承新的子类。装饰模式可以有效地避免过多的子类和上帝对象(GodObject),使得系统更加灵活和易于维护。装饰模式的主要特点包括:1.保持接口一致性:装饰模式确保被装饰的对象和原始对象具有相同的接口,这样客户端就可以透明地使用装饰后的对象,而无需知道装饰层的存在。2.动态扩展功能:通过在运行时添加装饰对象,可以在不改变原有代码的情况下,动态地给对象添加新的行为或功能。3.避免子类爆炸:相比于通过继承来扩展功能,装饰模式可以避免产生大量的子类。因为只需要创建新的装饰类来添加新功能,而不是通过继承来创建新的子类。4.组合优于继承:装饰模式体现了组合优于继承的原则,因为它允许在运行时根据需要组合行为,而不是在编译时通过继承来静态地决定行为。装饰模式通常包含以下几个角色:-Component(组件):这是抽象组件,定义了一个接口,该接口由所有具体组件和装饰对象共享。-ConcreteComponent(具体组件):具体组件实现Component接口,并提供实际的功能。-Decorator(装饰者):装饰者是一个抽象类或接口,它继承或实现了Component接口,可以添加新的行为。-ConcreteDecorator(具体装饰者):具体装饰者类继承Decorator类,并添加特定的行为。下面是一个简单的装饰模式示例,用于给饮料添加配料:```javapublicabstractclassDrink{publicabstractdoublecost();publicabstractStringgetDescription();}publicclassTeaextendsDrink{@Overridepublicdoublecost(){return2.5;}@OverridepublicStringgetDescription(){return"Tea";}}publicabstractclassDrinkDecoratorextendsDrink{protectedDrinkdrink;publicDrinkDecorator(Drinkdrink){this.drink=drink;}}publicclassMilkDecoratorextendsDrinkDecorator{publicMilkDecorator(Drinkdrink){super(drink);}@Overridepublicdoublecost(){returndrink.cost()+1.0;}@OverridepublicStringgetDescription(){returndrink.getDescription()+"withmilk";}}publicclassSugarDecoratorextendsDrinkDecorator{publicSugarDecorator(Drinkdrink){super(drink);}@Overridepublicdoublecost(){returndrink.cost()+0.5;}@OverridepublicStringgetDescription(){returndrink.getDescription()+"withsugar";}}publicclassMain{publicstaticvoidmain(String[]args){Drinktea=newTea();System.out.println("Costoftea:"+tea.cost());DrinkteaWithMilk=newMilkDecorator(tea);System.out.println("Costofteawithmilk:"+teaWithMilk.cost());DrinkteaWithSugar=newSugarDecorator(teaWithMilk);System.out.println("Costofteawithsugarandmilk:"+teaWithSugar.cost());}}```在这个例子中,`

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论