装饰器模式是什么?
2 个回答
看透不说透,是规矩,也是格局。商正梁# 装饰器模式 ## 定义 在不改变目标结构的情况下,动态的给对象增加功能 ## 举例 如房子装修、相片加相框等,都是装饰器模式。 ## 基本组件 - 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。 - 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。 - 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。 - 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。 ## 类图  ## 代码 ``` package com.lglbc.decorator; public interface Component { public void execute(); } ``` ``` package com.lglbc.decorator; public class ConcreteComponent implements Component{ @Override public void execute() { System.out.println("开始执行原始操作..."); } } ``` ``` package com.lglbc.decorator; public abstract class Decorator implements Component{ private Component component; public Decorator(Component component) { this.component = component; } @Override public void execute() { component.execute(); } } ``` ``` package com.lglbc.decorator; public class DecoratorA extends Decorator{ public DecoratorA(Component component) { super(component); } @Override public void execute() { addExcExecute(); super.execute(); } public void addExcExecute(){ System.out.println("对方法进行装饰处理"); } } ``` ``` package com.lglbc.decorator; public class Main { public static void main(String[] args) { Component component = new DecoratorA(new ConcreteComponent()); component.execute(); } } ```编辑于 2025-07-16 03:17 •IP属地 北京举报评论收藏
自己喜欢的东西又何必问别人好不好小王子-B612装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在不修改现有对象结构的情况下,动态地为对象添加新的功能。这种模式通过创建一个装饰类来包装原始类,并提供附加的功能。 ### 结构 1. **组件接口(Component)**:定义对象的接口,可以为这些对象动态添加职责。 2. **具体组件(ConcreteComponent)**:实现组件接口,表示被装饰的原始对象。 3. **装饰器(Decorator)**:实现组件接口,持有一个组件对象的引用,并定义与组件接口一致的接口。 4. **具体装饰器(ConcreteDecorator)**:继承装饰器,增加新的行为。 ### 示例代码 #### 组件接口 ```java // 组件接口 public interface Person { void show(); } ``` #### 具体组件 ```java // 具体组件:具体的人 public class PersonImpl implements Person { private String name; public PersonImpl(String name) { this.name = name; } @Override public void show() { System.out.println("装扮的" + name); } } ``` #### 装饰器 ```java // 装饰器 public class ClothingDecorator implements Person { protected Person person; public ClothingDecorator(Person person) { this.person = person; } @Override public void show() { if (person != null) { person.show(); } } } ``` #### 具体装饰器 ```java // 具体装饰器:夹克 public class JacketDecorator extends ClothingDecorator { public JacketDecorator(Person person) { super(person); } @Override public void show() { System.out.print("夹克 "); super.show(); } } // 具体装饰器:帽子 public class HatDecorator extends ClothingDecorator { public HatDecorator(Person person) { super(person); } @Override public void show() { System.out.print("帽子 "); super.show(); } } ``` #### 客户端代码 ```java public class Client { public static void main(String[] args) { Person laowang = new PersonImpl("老王"); // 给老王穿上夹克 Person jacketLaowang = new JacketDecorator(laowang); // 给老王戴上帽子 Person hatLaowang = new HatDecorator(jacketLaowang); hatLaowang.show(); // 输出:帽子 夹克 装扮的老王 } } ``` ### 优点 1. **遵循开闭原则**:可以在不修改原始类的情况下扩展功能。 2. **更灵活的功能扩展**:相比继承,装饰器模式可以动态地添加或删除功能,组合不同的装饰器来获得各种功能组合。 3. **减少子类数量**:通过使用装饰器模式,可以减少因继承而导致的子类爆炸问题。 ### 缺点 1. **创建过多的装饰类**:使用装饰器模式会产生许多的小对象,增加了系统的复杂性。 2. **调试困难**:由于装饰器的嵌套使用,使得在调试时难以发现问题的来源。 ### 适用场景 - 需要扩展一个类的功能,或给一个类增加附加职责。 - 需要动态地为一个对象增加功能,并且这些功能可以动态地撤销。 - 需要通过一种透明的方式为多个对象添加功能。 装饰器模式在Java的IO流中得到了广泛应用,例如`BufferedReader`和`BufferedWriter`都是装饰器模式的典型应用。发布于 2024-08-07 03:56 •IP属地 江西举报评论收藏
公众号进入网站体验更佳

