文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何动态地给一个类增加功能?

2024-12-02 01:54

关注

今天给大家介绍另一种常用的设计模式——装饰器模式。

1.什么是装饰器模式?

Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.

装饰器模式(Decorator Pattern):动态的给一个对象添加额外的职责,就增加功能来说, 装饰模式相比生成子类更为灵活。

说人话:一般的,我们为了扩展一个类经常使用继承方式实现,随着扩展功能的增多,子类会很膨胀。这时候期望在不改变类对象及其类定义的情况下,为对象添加额外功能,这就是装饰器模式。

2.装饰器模式定义

①Component抽象构件

Component是一个接口或者是抽象类, 就是定义我们最核心的对象, 也就是最原始的对象。

②ConcreteComponent 具体构件

ConcreteComponent是最核心、 最原始、 最基本的接口或抽象类的实现, 你要装饰的就是它。

③Decorator装饰角色

一般是一个抽象类, 实现接口或者抽象方法, 它里面可不一定有抽象的方法, 在它的属性里必然有一个private变量指向Component抽象构件。

④ConcreteDecorator 具体装饰角色

ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类, 你要把你最核心的、 最原始的、 最基本的东西装饰成其他东西

3.装饰器模式通用代码实现


public abstract class Component {
public abstract void operator();
}

public class ConcreteComponent extends Component{
@Override
public void operator() {
System.out.println("doSomething");
}
}

public abstract class Decorator extends Component{
private Component component;

public Decorator(Component component){
this.component = component;
}

// 委托给被修饰者执行
@Override
public void operator() {
this.component.operator();
}
}
public class ConcreteDecorator1 extends Decorator{
// 定义被修饰者
public ConcreteDecorator1(Component component){
super(component);
}

// 定义自己的修饰方法
public void method1(){
System.out.println("修饰方法 method1");
}
@Override
public void operator() {
this.method1();
super.operator();
}
}

客户端测试:

public class DecoratorClient {
public static void main(String[] args) {
Component component = new ConcreteComponent();
// 第一次修饰
component = new ConcreteDecorator1(component);
// 第二次修饰
component = new ConcreteDecorator2(component);
// 修饰后运行
component.operator();
}
}

打印结果:

4.装饰器模式优点

①装饰模式可以动态地扩展一个实现类的功能。

②装饰类和被装饰类可以独立发展, 而不会相互耦合。换句话说, Component类无须知道Decorator类, Decorator类是从外部来扩展Component类的功能, 而Decorator也不用知道具体的构件。

③装饰模式是继承关系的一个替代方案。我们看装饰类Decorator, 不管装饰多少层, 返回的对象还是Component, 实现的还是is-a的关系

5.装饰器模式应用场景

①、需要扩展一个类的功能, 或给一个类增加附加功能。

②、需要动态地给一个对象增加功能, 这些功能可以再动态地撤销。

来源:Java技术指北内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯