设计模式之装饰器 Decorator

简介: 设计模式之装饰器 Decorator

在原本的东西的基础之上加上一层装饰

当需要在原来的类上进行包装的时候,按照传统的方式需要一层层的继承,这样显然不方便。

  • 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
  • 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
  • 装饰器模式完全遵守开闭原则

其主要缺点是:装饰器模式会增加许多子类,过度使用会增加程序得复杂性。

装饰器设计模式的必备要素:

  1. 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
  2. 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
  3. 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  4. 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

下面我们看一下代码实现:

首先,需要定义一个抽象构件,即接口,这里面要放我们想要实现的方法规范

public interface Animal {
    void getDesc();
    void getPrice();
}

然后 定义一个具体构件,实现抽象构件,在之后我们通过装饰器来装饰具体构件

public class Cat implements Animal{
    @Override
    public void getDesc() {
        System.out.println("这是猫!");
    }
    @Override
    public void getPrice() {
        System.out.println("不要钱");
    }
}

定义抽象的装饰器,这里持有抽象构件的引用,并通过构造器传入引用,这样达到增强的作用

public abstract class Decorator implements Animal{
    protected Animal animal;
    public Decorator(Animal animal){
        this.animal = animal;
    }
    @Override
    public void getDesc() {
        animal.getDesc();
        System.out.println("加了装饰的猫");
    }
    @Override
    public void getPrice() {
        animal.getPrice();
        System.out.println("3块钱");
    }
}

可以看到,在以上代码中,我们赋予了引用具体的对象。并且在实现抽象构件的方法中,调用了我们传入的对象的方法,并且在这之后去做一些其他的功能,这样就达到了不修改代码,对原来的功能进行增强的目的

最后,我们看一下具体的构件装饰器

public class WhiteCatDecorator extends Decorator{
    public WhiteCatDecorator(Animal animal) {
        super(animal);
    }
    @Override
    public void getPrice() {
        super.getPrice();
        System.out.println("20块钱");
    }
    @Override
    public void getDesc() {
        super.getDesc();
        System.out.println("这是白猫");
    }
}

具体的逻辑就是提供构造器入口赋值,然后对原来的方法进行增强

目录
打赏
0
6
6
0
750
分享
相关文章
设计模式13 - 装饰模式【Decorator Pattern】
设计模式13 - 装饰模式【Decorator Pattern】
50 0
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
73 2
重构你的代码:探索Java中的混合、装饰器与组合设计模式
【8月更文挑战第30天】在软件开发中,设计模式为特定问题提供了结构化的解决方案,使代码更易理解、维护及扩展。本文将介绍三种常用的 Java 设计模式:混合模式、装饰器模式与组合模式,并附有示例代码展示实际应用。混合模式允许通过继承多个接口或抽象类实现多重继承;装饰器模式可在不改变对象结构的情况下动态添加新功能;组合模式则通过树形结构表示部分-整体层次,确保客户端处理单个对象与组合对象时具有一致性。
82 1
利用 Xamarin 开展企业级移动应用开发:从用户登录到客户管理,全面演示C#与Xamarin.Forms构建跨平台CRM应用的实战技巧与代码示例
【8月更文挑战第31天】利用 Xamarin 进行企业级移动应用开发能显著提升效率并确保高质量和高性能。Xamarin 的跨平台特性使得开发者可以通过单一的 C# 代码库构建 iOS、Android 和 Windows 应用,帮助企业快速推出产品并保持一致的用户体验。本文通过一个简单的 CRM 示例应用演示 Xamarin 的使用方法,并提供了具体的代码示例。该应用包括用户登录、客户列表显示和添加新客户等功能。此外,还介绍了如何增强应用的安全性、数据持久化、性能优化及可扩展性,从而构建出功能全面且体验良好的移动应用。
90 0
Ruby设计模式大揭秘!代理VS装饰器,你选对了让代码起舞的魔法棒吗?
【8月更文挑战第31天】在软件开发中,设计模式能够提升代码质量和团队协作效率。本文将介绍Ruby中的两种重要模式:代理(Proxy)和装饰器(Decorator)。代理模式通过中间对象控制对目标对象的访问,适用于访问控制、延迟加载等场景;装饰器模式则允许在不改变原对象结构的情况下动态添加新功能,比生成子类更灵活。通过具体示例代码,我们将深入理解这两种模式的实现和应用,帮助开发者更好地选择合适的模式解决问题。
64 0
Java 设计模式:混合、装饰器与组合的编程实践
【4月更文挑战第27天】在面向对象编程中,混合(Mixins)、装饰器(Decorators)和组合(Composition)是三种强大的设计模式,用于增强和扩展类的功能。
112 1
【设计模式】美团三面:你连装饰器都举不出例子?
【设计模式】美团三面:你连装饰器都举不出例子?
67 0
python的装饰器与设计模式中的装饰器模式
python的装饰器与设计模式中的装饰器模式
认真学习设计模式之装饰者模式(Decorator Pattern)
写在前言 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。通过动态地组合对象,可以写新的代码添加新功能,而无须修改现有代码。既然没有改变现有代码,那么引进bug或产生意外副作用的机会将大幅度减少。
102 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等