锈才学设计模式之 —— 装饰者模式
装饰者模式:在运行时动态的将行为扩展到装饰者对象上,符合"对扩展开放,对修改关闭"原则.
说明:
通俗点说,装饰者模式就是,一个类把另一个类装载进来进行包装,实现更多特性,他们都实现相同的接口.比如:
形像设计店,有顾客进去,设计师就可以把顾客造型,包装成一个新的形象.
装修公司,接手一个毛坏房,设计师就可以把房子装饰成一个风格时尚的精品房
在设计一个扩展的功能时,一般都是使用继承,由子类继承父类.比如商品对象:
这种继承关系的设计是对功能提供了扩展,但是设计的弹性不够.
比如:
1. 新增了礼包和赠送商品,在暑假大促销活动中,当用户购买了实物商品配送大礼包,购买虚拟商品赠送虚似商品(如游戏装配),在这种情况,商品需要与礼包和赠送商品组合,就不得不重新修改商品的购买规则代码才能满足需求.如果活动取消,又要修改购买规则代码.
2. 其次就是,实物商品有很多种类:图书商品、电子商品、票务商品、食品商品等,礼包也包括:光碟、消费券等,如果具备好的设计,面对众多的业务规则变化,扩展和维护都将是一个非常烦恼的事。
我们需要一种面向接口设计、对象之间松耦合的模式,来解决问题。
这里学习的装饰者模式,就提供了一种更具弹性的扩展形式.扩展的时候不需要修改原有的类,就能将新的业务行为增加到原有的对象中.同是做到“对扩展开放,对修改关闭”的OO设计原则.装饰者模式的结构图:
根据装饰者模式,将商品的设计做修改。如下图:
经过装饰者模式的设计后,我们就解决了上述的问题:
礼包和赠送商品都继承了商品抽象类(装饰者接口,这里也可以是实现接口,因为商品是继承商品基类,所以也就采用抽象类),同时礼包和赠送商品中都包括了一个商品基类的引用(如果是接口,就是接口的引用),达到类型一致,面向接口编程。当开展暑假促销活动时,用户购买了一个实物商品(比如一本书),我们就配送一份礼包(比如:购书券).代码如下:
示例代码:
== 商品基类 ==
package decorator;
//商品基类
public abstract class Merchandise {
private String merchandiseId;
private String merchandiseName;
private Double price;
private int stock;
//购买
public void buy(){
//具体购买规则
}
}
== 实物商品(图片)类 ==
package decorator;
public class BookMerchandise extends Merchandise{
//复写购买
public void buy(){
}
}
== 装饰抽象类 ==
package decorator;
//装饰抽象类或接口
public abstract class Decorator extends Merchandise{
//继承上面的方法
public void buy(){
}
//可以实现一些其它方法
public abstract String showDescription();
}
== 礼包类 ==
package decorator;
//礼包或赠送商品
public class Gift extends Decorator{
Merchandise merchandise;//这里是商品基类,也就是被装饰者的基类,在构造器中赋值
public Gift(Merchandise merchandise){
this.merchandise = merchandise;
}
@Override
public String showDescription() {
// TODO Auto-generated method stub
return null;
}
@Override
public void buy() {
// 购买行为,可以包括被装饰者的行为如图书商品的购买
merchandise.buy();//被装饰者的购买
//礼品的配送(购买)
}
}
== 测试购买商品类 ==
package decorator;
//测试购买
public class BuyTest {
public static void main(String[] args){
//直接购买图书商品,
Merchandise merchandise = new BookMerchandise();
merchandise.buy();
//-----------------------------------------------
//购买图书商品配送礼包
Merchandise merchandise1 = new BookMerchandise();
//将图书商品(merchandise)装饰到Gift(礼包)商品中
merchandise1 = new Gift(merchandise1);
//调用礼包的购买(buy)方法,在方法中购买商品的时候配送礼包,或其它行为
merchandise.buy();
//当购买商品配送其它礼包,可以新增一个商品,
//实现装饰者接口(Decorator)再将商品装饰进来就可以了
//这样以后增加商品或增加行为只要扩展对象就行,不需要修改原来的类.
}
}
上面的代码中,做到了非常有弹性的扩展性。增加商品或礼包等,都不会影响原有的类。扩展类的行为,只要实现装饰者接口或抽象类,就可以松耦合的增加类,增加行为。
在JDK AIP中,有很多地方实现装饰者模式。可以查看JDK查看内置的装饰者模式代码:java.io.InputStream,API结构如图:
这种设计模式在古时候劳动人民的智慧中就有体现,比如大家都看过<葫芦兄弟>这部动画片吧.葫芦兄弟,有红、橙、黄、绿、青、蓝、紫七个大葫芦娃。每个人都有独特的本领,红娃是大力士,橙娃是千里眼和顺风耳,黄娃是硬铁头,绿娃会火功,青娃有水性,蓝娃有隐身术,紫娃有宝葫芦,但是都斗不过蝎子精和蛇精,只有7个葫芦娃团结一起,集7个人的力量于一身时,才能发挥无穷能量,打败蝎子精和蛇精。这其实也是装饰者模式的例子,7个葫芦娃变成一个葫芦娃时,这个葫芦娃就是装饰者,其它葫芦娃是被装饰者,装饰者集中了大力士、千里眼和顺风耳、硬铁头、火功、水性、隐身术、宝葫芦功能强大。所以能胜利。
- 大小: 28.8 KB
- 大小: 23.1 KB
- 大小: 53.7 KB
- 大小: 37.4 KB
分享到:
相关推荐
C#设计模式中的“装饰者(Decorate)”模式是一种结构型模式,它允许动态地给一个对象添加新的行为或职责,而不影响其它对象。装饰者模式的核心在于,它提供了向对象添加新功能而不使用继承的方法,从而避免了类爆炸...
第三个例子进一步展示了装饰者模式的灵活性,通过`tree`对象的`decorate`和`getDecorator`方法,我们可以创建并应用多个装饰器,如`RedBalls`和`BlueBalls`,这些装饰器可以按需堆叠,以实现更复杂的装饰逻辑。...
装饰模式是一种结构型设计模式,它允许在不改变对象本身的基础上,在运行时为对象添加新的功能。这种模式常被用于给对象动态地增加职责,尤其是当需要为对象添加多个职责时,比继承更加灵活且避免了类的爆炸性增长。...
例如,InputStream 和 OutputStream 中的 decorate 方法就是使用了装饰器设计模式。 Java 装饰器设计模式是一种非常有用的设计模式,它可以使得系统更加灵活、可维护和可扩展。通过动态地给对象添加新的行为,我们...
在"设计模式(七)之装饰模式.zip"的压缩包中,核心文件"Decorate.cs"及其可能的子类,揭示了装饰模式的实现细节。 首先,让我们理解装饰模式的基本结构。装饰模式通常包含以下角色: 1. 抽象组件(Component):定义...
装饰模式是一种结构型设计模式,它允许我们向一个对象添加新的功能或行为,而不改变其原有的类。在Java中,装饰模式通常通过继承和组合来实现。下面将详细讲解装饰模式的基本概念、工作原理以及如何在Java中进行实现...
里面包含了23中设计模式源代码,其中包括工厂模式(Factory)、单例(Singleton)、观察者模式(Observer)、适配器模式(Adapter)、Template模式、Decorate模式、proxy模式等 这些代码对于初学者看起来稍微复杂一些,我...
装饰器模式(decorate) 外观模式(facecade) 享元模式(flyweight) 代理模式(proxy) 行为型模式(behaviour) 责任链模式(chainrespon) 命令模式(commond) 解释器模式(interpreter) 迭代器模式(iterator) 中介者模式...
Python retry 装饰器详解 Python 语言中,retry 装饰器是一种非常有用的机制,能够帮助开发者在编写代码时,轻松地实现函数的重试机制。本文将对 Python 中的 retry 装饰器进行详细的讲解,包括其定义、使用方法、...
装饰者模式是面向对象设计中的一种重要模式,它在JavaScript中的应用非常广泛,尤其是在需要动态扩展对象功能的情况下。装饰者模式的核心思想是为一个对象添加新的行为或职责,而不必改变其原有的类结构,以此来避免...
获取到【文件夹】名称: decorate_pattern 获取到【文件夹】名称: facade_pattern 获取到【文件夹】名称: flyweight_pattern 获取到【文件夹】名称: interperter_pattern 获取到【文件夹】名称: iterator_...
装饰模式是一种设计模式,它允许在不修改原有对象的情况下,通过添加新的行为或扩展功能来增强对象的能力。这种模式在Python中尤其有用,因为它提供了高度的灵活性,可以在运行时动态地改变对象的行为。 在装饰模式...
**工厂模式**是JavaScript中最常见的设计模式之一,其核心在于提供一个创建对象的接口,但允许子类决定实例化哪一个类。工厂模式将对象的创建过程封装起来,使客户端无需关心具体的创建细节。例如,在创建复杂的UI...
装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象本身。这种模式的核心思想是通过将对象包装在一个装饰类中来扩展功能,而不是通过继承。装饰者模式与代理模式有些相似,但...
装饰器在Python中是一个强大的设计模式,允许我们在不修改原有代码的情况下,扩展或修改函数、方法或类的行为。这个名为"decorate"的库可能是为了简化和增强Python中的装饰器使用而创建的。版本号"0.0.13"表明这是该...
装饰器模式,也称为装饰者模式,是一种设计模式,它允许在不修改对象本身的情况下,通过添加新的行为或属性来扩展对象的功能。这种模式在PHP中尤其有用,因为PHP是动态类型的语言,允许灵活地创建和修改对象。下面将...
装饰器模式(decorate) 外观模式(facecade) 享元模式(flyweight) 代理模式(proxy) 行为型模式(behaviour) 责任链模式(chainrespon) 命令模式(commond) 解释器模式(interpreter) 迭代器模式(iterator) 中介者模式...
里面包含了23中设计模式源代码,其中包括工厂模式(Factory)、单例(Singleton)、观察者模式(Observer)、适配器模式(Adapter)、Template模式、Decorate模式、proxy模式等 这些设计模式源代码更容易理解
《小书匠语法说明之HTML属性配置decorate详解》 在数字内容创作领域,小书匠作为一个强大的文本编辑工具,提供了丰富的语法支持,其中HTML属性配置(decorate)是其特色功能之一。这个功能允许用户为生成的HTML片段...