装饰器模式应用场景_装饰器设计模式的应用

本文介绍了装饰设计模式在实际中的应用,特别是在处理图形、树木和动态更改时的使用。通过实现学生装饰的例子,展示了如何用学位和医生头衔装饰对象。文章详细解释了装饰器模式的UML图、接口和抽象类的定义,并提供了具体的装饰器实现,如AmericanGirl和EuropeanGirl。最后,通过代码示例展示了如何在运行时动态装饰和增强对象的功能。
摘要由CSDN通过智能技术生成

装饰器模式应用场景

嗨,您好!

今天,我将展示装饰设计模式的实际应用。 装饰器设计模式是一种广泛使用的设计模式,同时在运行期间处理图形,树木和动态更改。

如果您正在寻找或尝试进行递归,这也是一个不错的选择。 我喜欢它。 在这篇文章中,我们将实现学生装饰。 我们将用学位和医生的头衔装饰它。 看看它如何在现实世界中工作的一个很好的例子。

首先,让我们看一下其最简单的版本的UML图。 之后,我们将以此类推为例。

最简单的UML

请密切注意,因为一旦您理解了,一切都会变得清晰易懂。 这就是我将最简单的模型放在第一位的原因。

装饰工

了解细节

装饰将是通用接口Decorable的每个具体实现。 装饰器将是抽象类Decorator的每个实现。 它定义了装饰者的合同,该合同持有可装饰对象的实例。 让我们深入研究一些代码来修复它:

// 1. COMMON INTERFACE FOR DECORABLES
public interface Decorable {
    public String getDescription();
}
// 2. THE ABSTRACT DECORADOR WHICH HOLDS A REFERENCE TO DECORABLES
public abstract class Decorator implements Decorable {
    protected Decorable component;
    public Decorator(Decorable component){
        super();
        this.component=component;
    }
}

类比我们的学生的例子

让我们首先从UML​​图开始:

装饰员(1)

普通可装饰女孩

在这里,我们从类比开始。 界面Girl是可装饰的。 GirlDecorator用下面的具体装饰器定义抽象装饰器的合同。

// 1. COMMON INTERFACE FOR DECORABLES
public interface Girl {
    public String getDescription();
}
// 2. THE ABSTRACT DECORADOR WHICH HOLDS A REFERENCE TO DECORABLES 
public abstract class GirlDecorator implements Girl {
    protected Girl girl;
    public GirlDecorator(Girl girl){
        super();
        this.girl=girl;
    }
}
// 3. DEFINING CONCRETE DECORATORS
public class Science extends GirlDecorator {
    public Science(Girl girl) {super(girl);}
    @Override
    public String getDescription() {
        // DECORATES WITH A SCIENCE'S DEGREE
        return girl.getDescription() + "+Like Science";
    }
    public void caltulateStuff() {
        // ADDS NEW FEATURES (METHOD) TO IT
        System.out.println("scientific calculation!");
    }
}
public class Art extends GirlDecorator {
    public Art(Girl girl) {super(girl);}
    @Override public String getDescription() {return girl.getDescription() + "+Like Art";}
    public void draw() {System.out.println("draw pictures!");}
}
public class Doctor extends GirlDecorator {
    public Doctor(Girl girl) {super(girl);}
    @Override public String getDescription() {return girl.getDescription() + "+Like Doctor";}
    public void calculateStuff() {System.out.println("doctor calculation!");}
    public void doctorTitle() {System.out.println("doctor title");}
}

装饰物

AmericanGirl和EuropeanGirl是可在运行时以学位和医生名义装饰的装饰,以增强其课程和能力。

// 4. AN AMERICAN GIRL WILL BE DEFINED AS A DECORABLE
public class AmericanGirl implements Girl {
    private String description="";
    // NORMAL AMERICAN GIRL
    public AmericanGirl(){
        super();
        description = "+American";
    }
    @Override public String getDescription() {return description;}
}
public class EuropeanGirl implements Girl {
    private String description="";
    public EuropeanGirl() {
        super();
        description = "+European";
    }
    @Override public String getDescription() {return description;}
}

测试它

现在让我们在实践中看看它的外观。 我们如何在运行时装饰和增强其功能:

public class Client {
    public static void main(String[] args) {
        // COMMOM GIRL
        Girl girl;
        
        // CREATING NORMAL AMERICAN GIRL
        girl = new AmericanGirl();
        System.out.println(girl.getDescription());
 
        // DECORANTING AMERICANA GIRL WITH SCIENCE'S DEGREE
        girl = new Science(girl);
        System.out.println(girl.getDescription());
 
        // DECORANTING AMERICANA GIRL WITH ART'S DEGREE
        girl = new Art(girl);
        System.out.println(girl.getDescription());
        
        // EUROPEAN GIRL HAS ALREADY ALL DEGREES   
        Girl europeia = new Science(new Art(new EuropeanGirl()));
        System.out.println(europeia.getDescription());
        
        // DOCTOR HAS NEW FUNCTIONS    
        girl = new Doctor(girl);
        System.out.println(girl.getDescription());
        // BECAUSE DOCTOR EXTENDS FROM COMMON GIRL, IT CAN DO A DOWNCAST
        ((Doctor)girl).doctorTitle();
        ((Doctor)girl).calculateStuff();
        
        // PAY ATTENTION THAT WE USE THE SAME INSTANCE, BUT THEY BEHAVIOR DIFFERENT
        // AT DIFFERENT TIME SLOTS. THE CLIENT HAS THE IMPRESSION THAT WE HAVE
        // CHANGED THE IMPLEMENTATION, BUT IN FACT NOT.
    }
}

就这样! 希望你喜欢!

翻译自: https://www.javacodegeeks.com/2014/08/decorator-design-pattern-applied.html

装饰器模式应用场景

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值