装饰者模式的应用示例

装饰者模式的作用

装饰者模式可以复用系统中的各个单一功能组件,在运行时,可以将这些组件进行叠加,构造一个‘超级对象’,使得具有这些组件的功能。

装饰者模式的应用

举个用户下单的业务场景。

原有业务:用户下单,系统涉及到调用第三方接口,即下单接口。因此,当用户下单时,系统只需调用第三方接口来我完成下单操作即可。

目前系统中有:1)下单接口OrderService;

2)下单接口的具体实现OrderServiceImpl,这个实现类主要是处理调用第三方接口来完成下单操作;

新增业务:系统中为了能够对用户下的订单进行统计分析,需要将用户下的单在本地备份一份。因此,系统在处理用户下单时,需要进行两步:①调用第三方下单接口使得下单成功;②下单成功后,将订单信息保存到本地数据库中。

为了实现这个新增业务,可以使用装饰者模式。

基于系统中有的接口及类,为了满足新增业务需求,需要增加:

1)实体类Order,为添加到数据库的订单实体

2)dao层saveOrder

类图:

代码:

1)OrderServiceImpl:调用第三方处理用户下单操作

public class OrderServiceImpl implements OrderService {

public boolean addOrder(Order order) {
        System.out.println("调用第三方接口正在下单...");
        
        System.out.println("下单者:"+order.getBuyer());
        
        return true;
    }

}

2)OrderServiceDecorator:装饰者

public abstract class OrderServiceDecorator implements OrderService{

OrderService orderService;
    
    public OrderServiceDecorator(OrderService orderService){
        this.orderService = orderService;
    }
}

3)SaveOrderToDB:具体装饰者,当用户下单成功后,将订单保存到本地db

public class SaveOrderToDB extends OrderServiceDecorator {
    
    public SaveOrderToDB(OrderService orderService) {
        super(orderService);
    }

public boolean addOrder(Order order) {
        orderService.addOrder(order);
        System.out.println("将订单保存到本地db中...");
        return true;
    }
}

测试类:

public class OrderDecoratorTest {

public static void main(String[] args) {
        Order order = new Order();
        order.setBuyer("wmmang");
        OrderService os = new SaveOrderToDB(new OrderServiceImpl());
        os.addOrder(order);
    }
}

打印结果:

装饰者模式的应用示例

时间: 2024-07-29 17:55:49

装饰者模式的应用示例的相关文章

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

设计模式——装饰者模式

1.装饰者模式是在不必改变原类文件和使用继承关系的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 2.装饰模式的特点: 1)      装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互. 2)      装饰对象包含一个真实对象的引用 3)      装饰对象接受所有来自客户端的请求.它把这些请求转发给真实的对象 4)      装饰对象可以在转发这些请求以前或以后增加一些附加功能.这样就确保了在运行时,不用修改给定

设计模式(3)--装饰者模式

什么是装饰者模式 俗话说,"人靠衣装,佛靠金装",大自然中许多事务都会有一些物体来装饰自己.那么在java的世界中这是如何进行模拟的呢?先举个现实中的例子来说明下这个模式究竟是怎么回事的吧.在生活中我们穿的衣服都是各式各样的,且在不同季节数量也是不一的.我们把一个人.一件衣服都看成一个对象,那么Java怎么实现这两者之间的关系.在人这个对象中有个display方法,这个方法需要打印出名字和穿着的衣服名字,这时候你会怎么办呢?装饰者模式就是用来解决这种类型的问题. 深入理解装饰者模式 现

JavaScript高级---装饰者模式设计

一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生产对象,实现解耦. 桥接模式 : (桥接模式是一种既能把两个对象连接在一起,又能避免二者间的强耦合的方法.通过“桥”把彼此联系起来,同时又允许他们各自独立变化) 主要作用:主要作用表现为将抽象与其实现隔离开来,以便二者独立化. 组合模式 : (组合模式是一种专门为创建Web上的动态用户界面而量身制定

装饰者模式(Decorator Pattern)

一.装饰者模式的内容 装饰(Decorator)模式又名包装(Wrapper)模式[GOF95].装饰者模式动态地将责任附加到对象上.想要扩展功能,装饰者提供有别于继承的另一种选择.该模式以对客户端透明的方式扩展对象的功能.利用组合在运行时动态的合成自己想要的对象,这比继承更具弹性,是继承关系的一个替代方案. 二.装饰者模式的结构 涉及角色 (1)抽象构件角色:定义一个抽象接口,来规范准备附加功能的类. (2)具体构件角色(即被装饰者):将要被附加功能的类,实现抽象构件角色接口. (3)抽象装饰

java设计模式-装饰者模式

定义: 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 概述: 1.装饰者和被装饰对象有相同的超类型. 2.你可以用一个或多个装饰者包装一个对象. 3.既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合 ,可以用装饰过的对象代替它. 4.装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的. 5.对象可以在任何时候被装饰,所以可以在运行时动态地.不限量地用你喜欢的装饰者

Java 设计模式—装饰者模式

在Java编程语言中,嵌套了很多设计模式的思想,例如IO流中的缓冲流就使用到下面要介绍的装饰者设计模式. 示例代码: * 抽象构件角色:定义一个抽象接口,来规范准备附加功能的类 * @author Admin * */ public interface Drink { //被装饰者的基类 public String description(); public int price(); } /** * 具体构件角色:将要被附加功能的类,实现抽象构件角色接口 * @author Admin * */

设计模式(十):Decorator装饰者模式 -- 结构型模式

1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办?前一个,只能在于运行时完成,后者

设计模式(八)装饰器模式Decorator(结构型)

设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许