装饰器设计模式的应用

嗨,您好!

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

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

首先,让我们看一下它最简单的版本的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
    评论
装饰模式在Java中的应用场景有很多。它可以在不改变原有对象的情况下,动态地给一个对象扩展功能,即插即用。以下是几个常见的应用场景: 1. 动态扩展功能:当需要给一个对象动态地增加或修改功能时,可以使用装饰模式。通过创建不同的装饰类及这些装饰类的排列组合,可以实现不同的效果。比如在一个房子输出的功能上增加额外的功能,可以使用装饰模式实现。 2. 组件复用:装饰模式可以将已有的组件进行包装,使其具有更多的功能,从而实现组件的复用。比如在一个已有的类上添加额外的功能,而不需要修改原有的类。 3. 动态代理:装饰模式也可以用于实现动态代理。通过创建一个代理类,代理类包装了一个真实的对象,并在调用真实对象的方法前后进行一些处理。比如在代理类中可以在调用真实对象的方法前后添加一些额外的操作。 总之,装饰模式在需要动态地给对象增加功能、组件复用以及动态代理等场景下非常有用。它可以灵活地扩展对象的功能,并且遵循开闭原则,不需要修改原有的代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java设计模式之《装饰模式》及应用场景](https://blog.csdn.net/u012308665/article/details/118108674)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Java设计模式装饰模式](https://blog.csdn.net/qq_37922483/article/details/125400945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值