Java设计模式之装饰者模式

简介:
装饰者模式
装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
具体被装饰者和抽象装饰类都继承于相同的抽象类,继承的是类型,而不是行为 。行为来自装饰者和基础组件,或与其他装饰者之间的组合关系。它也称为追MM模式。
在实际开发中,对于应用中,如果一个基类包含许多个不同的子类,而每一个子类具有不同的附加物。此时就可以考虑用装饰者模式了。在装饰者模式中,要划分出哪些是主体部分,哪些是装饰者。而一个主体可以拥有多个装饰者,装饰者又可以继续装饰装饰者,则就需要主体和装饰者继承于一个相同的基类类型。这样通过继承后,继承的就是类型,而不是行为。每一个装饰者都“有一个”主体,装饰者内部有一个实例变量作为引用保存某一个主体的。所有的装饰者统一实现一个装饰者接口。
通常在装饰者模式中,都采用抽象类。装饰者模式,被装饰者必须和装饰者实现相同的接口,一般是在装饰者行为或方法中转发被装饰者行为(即调用被装饰者的行为)。
在开发过程中,如果过于依赖继承,则类的行为就会在编译的时候静态决定了,行为如果不是来自超类,就是来自子类覆盖后的版本。而如果利用组合,在可以在运行中动态的组装了。
具体事例:
一个酒店有多个饮料,但是所有的饮料都需要继承同一个类,而每个饮料却又有不同的添加物.
抽象基类:
package com.whut.decorate;
//装饰者模式
public  abstract  class Beverage {

String description= "Unknown Beverage";

public String getDescription()
{
return description;
}

public  abstract  double cost();
}
它有多个具体类型的饮料,也就是多个被装饰者。列举一个:
package com.whut.decorate;
//综合咖啡
public class HouseBlend  extends Beverage {

public HouseBlend()
{
description= "HouseBlend";
}

@Override
public  double cost() {
// TODO Auto-generated method stub
return 0.89;
}
}
由于每一个 被装饰者,即饮料均有多个不同的添加。装饰者的抽象类类如下:
package com.whut.decorate;

//装饰者基类
public  abstract  class CondimentDecorator  extends Beverage {
public  abstract String getDescription();
}
具体装饰者:
package com.whut.decorate;

//摩卡装饰者
public class Mocha  extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage)
{
this.beverage=beverage;
}

@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage.getDescription()+ ",Mocha";
}

@Override
public double cost() {
// TODO Auto-generated method stub
return 0.2+beverage.cost();
}
}
测试类:
package com.whut.decorate;

public class CustomerDrink {

public static void main(String[] args)
{
Beverage beverage= new Espresso();
System.out.println(beverage.getDescription()+ " $"+beverage.cost());

//注意这种方式
//顶了两个Mocha和Whip的DarkRoast咖啡
Beverage beverage2= new DarkRoast();
beverage2= new Mocha(beverage2);
beverage2= new Mocha(beverage2);
beverage2= new Whip(beverage2);
System.out.println(beverage2.getDescription()+ " $"+beverage2.cost());

Beverage beverage3= new HouseBlend();
beverage3= new Soy(beverage3);
beverage3= new Mocha(beverage3);
beverage3= new Whip(beverage3);
System.out.println(beverage3.getDescription()+ " $"+beverage3.cost());

}
}
这里就是在运行中动态的装饰饮料。
在java中,常见的装饰者模式,就是I/O类。
设计原则 :类应该对扩展开放,对修改关闭。
主要的意思就是允许类容易扩展,在不修改现有的代码情况下,可以搭配新的行为,而这些行为往往是在运行的时候搭配的,通过装饰者模式动态的将责任附加到对象中。
要点总结
1)继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式。
2)在设计中,应该允许行为可以被扩展,而无须修改现有的代码。
3)组合和委托可用于在运行时动态地加上新的行为。
4)除了继承,装饰者模式也可以让我们扩展行为。
5 )装饰者模式意味着一群装饰者类,这些类用来包装具体组件。
6)装饰者类反映出被装饰的组件类型(事实上,他们具有相同的类型,都经过接口或继承实现)。
7)装饰者可以在被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的。
8)可以用无数个装饰者包装一个组件。
9)装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。
10)装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。


本文转自 zhao_xiao_long 51CTO博客,原文链接:http://blog.51cto.com/computerdragon/1155600

相关文章
|
11月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
1160 157
|
11月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
1054 2
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
11月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
2808 35
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
308 0
|
11月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
754 8
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
设计模式 缓存 安全
【设计模式】【结构型模式】装饰者模式(Decorator)
一、入门 什么是装饰者模式? 装饰者模式(Decorator Pattern)是 Java 中常用的结构型设计模式,它能在不修改原有对象结构的前提下,动态地为对象添加额外的职责。 为什么要装饰者模式?
383 8
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。

热门文章

最新文章