文档章节

使用桥接模式来显示下单结果

算法之名
 算法之名
发布于 09/03 18:07
字数 1111
阅读 929
收藏 17

用工厂方法模式来下不同订单 中我们看到,我们只简单显示来一个“下单成功”,但实际上我们需要给用户返回到结果可能多种多样。

先增加一个订单结果到接口。

public interface OrderSuccessResult {
    public OrderSuccessResult getResult(Order order);
}

添加一个服务订单结果实现类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ServiceOrderSuccessResult implements OrderSuccessResult {
    private String content;
    private String storeName;
    private String orderCode;
    private String servicContent;
    private Date serviceDate;
    private String storeAddress;
    private BigDecimal serviceAmount;

    @Override
    public OrderSuccessResult getResult(Order order) {
        ServiceOrderSuccessResult orderSuccessResult = ServiceOrderSuccessResult.builder()
                .content("服务商家正在审核,请耐心等待")
                .orderCode(((ServiceOrder)order).getCode())
                .serviceAmount(((ServiceOrder)order).getService().getService().getPrice().getNormalPrice())
                .serviceDate(((ServiceOrder)order).getServiceDate())
                .servicContent(((ServiceOrder)order).getService().getSimpleContent())
                .storeName(((ServiceOrder)order).getStore().getName())
                .storeAddress(((ServiceOrder)order).getStore().getAddress().getName())
                .build();
        return orderSuccessResult;
    }
}

给Order接口添加一个适配方法

public interface Order {
    public void makeOrder(Order order);
    public OrderSuccessResult getResult(Order order);
}

增加一个订单抽象类,完成对订单结果接口的桥接

public abstract class AbstractOrder implements Order {
    protected OrderSuccessResult orderSuccessResult;
}

修改各个Order的实现类,继承于该抽象类

@Data
@AllArgsConstructor
@NoArgsConstructor
@ServiceOrderVersion(value = 1)
@RequiredArgsConstructor
public class ServiceOrder extends AbstractOrder {
    private Long id;
    @NonNull
    private String code;
    @NonNull
    private Store store;
    @NonNull
    private ProviderService service;
    @NonNull
    private Car car;
    @NonNull
    private Date serviceDate;
    @NonNull
    private String contact;
    @NonNull
    private String contactTel;
    private AppUser user;
    @NonNull
    private String content;
    private int status;
    private Date createDate;


    @Override
    public void makeOrder(Order order) {
        ServiceOrderDao serviceOrderDao = SpringBootUtil.getBean(ServiceOrderDao.class);
        IdService idService = SpringBootUtil.getBean(IdService.class);
        ((ServiceOrder)order).setId(idService.genId());
        ((ServiceOrder)order).setCode(getCode(idService));
        AppUser loginAppUser = AppUserUtil.getLoginAppUser();
        AppUser user = new AppUser();
        user.setId(loginAppUser.getId());
        user.setUsername(loginAppUser.getUsername());
        ((ServiceOrder)order).setUser(user);
        ((ServiceOrder)order).setStatus(1);
        ((ServiceOrder)order).setCreateDate(new Date());
        serviceOrderDao.save((ServiceOrder) order);
    }

    @Override
    public OrderSuccessResult getResult(Order order) {
        this.orderSuccessResult = new ServiceOrderSuccessResult();
         return this.orderSuccessResult.getResult(order);
    }

    private String getCode(IdService idService) {
        String flow = String.valueOf(idService.genId());
        flow = flow.substring(14,flow.length());
        String pre = DateUtils.format(new Date(), DateUtils.pattern9);
        return pre + flow;
    }
}

我们可以看到this.orderSuccessResult = new ServiceOrderSuccessResult();ServiceOrderSuccessResult进行了耦合,此处需要修改。

Controller修改如下

@Slf4j
@RestController
public class OrderController {
    private ThreadLocal<OrderFactory> orderFactory = new ThreadLocal<>();
    private ThreadLocal<Order> orderService = new ThreadLocal<>();
    @Autowired
    private OrderBean orderBean;

    @Transactional
    @SuppressWarnings("unchecked")
    @PostMapping("/makeeorder")
    public Result<OrderSuccessResult> makeOrder(@RequestBody String orderStr, @RequestParam("type") String type) {
        log.info(orderStr);
        Order order = setOrderFactory(orderStr,type);
        orderService.get().makeOrder(order);
        return Result.success(orderService.get().getResult(order));
    }

    /**
     * 判断是哪一种类型的订单来获取哪一种类型的具体订单工厂
     * @param orderStr
     * @return
     */
    private Order setOrderFactory(String orderStr,String type) {
        Class<?> classType = orderBean.getOrderMap().get(type);
        Object order = JSONObject.parseObject(orderStr, classType);
//        if (orderStr.contains("service")) {
//            order = JSON.parseObject(orderStr, ServiceOrder.class);
//        }else if (orderStr.contains("product")) {
//            order = JSON.parseObject(orderStr, ProductOrder.class);
//        }
        Class<?> classFactoryType = orderBean.getOrderFactoryMap().get(type + "Factory");
        this.orderFactory.set((OrderFactory) SpringBootUtil.getBean(classFactoryType));
//        if (order instanceof ServiceOrder) {
//            this.orderFactory.set(SpringBootUtil.getBean(ServiceOrderFactory.class));
//        }else if (order instanceof ProductOrder) {
//            this.orderFactory.set(SpringBootUtil.getBean(ProductOrderFactory.class));
//        }
        orderService.set(orderFactory.get().getOrder());
        return (Order) order;
    }
}

现在运行是没有问题的。返回结果如下

{
"code" : 200 ,
"data" : {
"content" : "服务商家正在审核,请耐心等待" ,
"orderCode" : "2019090353318" ,
"servicContent" : "精细洗车" ,
"serviceAmount" : 100 ,
"serviceDate" : "2019-10-03T00:00:00.000+0800" ,
"storeAddress" : "北京市海淀区西北旺" ,
"storeName" : "三润汽修厂"
},
"msg" : "操作成功"
}
现在我们用简单工厂进行解耦合。添加版本标签
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ServiceResultVersion {
    int value();
}

ServiceOrderSuccessResult打上版本标签

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ServiceResultVersion(value = 1)
public class ServiceOrderSuccessResult implements OrderSuccessResult {
    private String content;
    private String storeName;
    private String orderCode;
    private String servicContent;
    private Date serviceDate;
    private String storeAddress;
    private BigDecimal serviceAmount;

    @Override
    public OrderSuccessResult getResult(Order order) {
        ServiceOrderSuccessResult orderSuccessResult = ServiceOrderSuccessResult.builder()
                .content("服务商家正在审核,请耐心等待")
                .orderCode(((ServiceOrder)order).getCode())
                .serviceAmount(((ServiceOrder)order).getService().getService().getPrice().getNormalPrice())
                .serviceDate(((ServiceOrder)order).getServiceDate())
                .servicContent(((ServiceOrder)order).getService().getSimpleContent())
                .storeName(((ServiceOrder)order).getStore().getName())
                .storeAddress(((ServiceOrder)order).getStore().getAddress().getName())
                .build();
        return orderSuccessResult;
    }
}

添加简单工厂类(其实这里也可以使用工厂方法模式,但怕过于复杂,故不使用工厂方法模式)

@Component
public class ServiceOrderSuccessResultFactory {
    @Getter
    private OrderSuccessResult orderSuccessResult;

    @PostConstruct
    private void init() {
        this.orderSuccessResult = createResult();
    }
    
    
    private OrderSuccessResult createResult() {
        Set<Class<?>> classes = ClassUtil.getClassSet("com.cloud.ownercar.domain");
        Object instance = null;
        try {
            //过滤有@ServiceResultVersion标签的类
            instance = classes.stream().filter(clazz -> clazz.isAnnotationPresent(ServiceResultVersion.class))
                    //过滤实现了OrderSuccessResult接口的类
                    .filter(clazz -> OrderSuccessResult.class.isAssignableFrom(clazz))
                    //找出版本号大的类,并实例化为对象
                    .max(Comparator.comparingInt(clazz -> clazz.getAnnotation(ServiceResultVersion.class).value()))
                    .get().newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return (OrderSuccessResult) instance;
    }
}

修改ServiceOrder如下

@Data
@AllArgsConstructor
@NoArgsConstructor
@ServiceOrderVersion(value = 1)
@RequiredArgsConstructor
public class ServiceOrder extends AbstractOrder {
    private Long id;
    @NonNull
    private String code;
    @NonNull
    private Store store;
    @NonNull
    private ProviderService service;
    @NonNull
    private Car car;
    @NonNull
    private Date serviceDate;
    @NonNull
    private String contact;
    @NonNull
    private String contactTel;
    private AppUser user;
    @NonNull
    private String content;
    private int status;
    private Date createDate;


    @Override
    public void makeOrder(Order order) {
        ServiceOrderDao serviceOrderDao = SpringBootUtil.getBean(ServiceOrderDao.class);
        IdService idService = SpringBootUtil.getBean(IdService.class);
        ((ServiceOrder)order).setId(idService.genId());
        ((ServiceOrder)order).setCode(getCode(idService));
        AppUser loginAppUser = AppUserUtil.getLoginAppUser();
        AppUser user = new AppUser();
        user.setId(loginAppUser.getId());
        user.setUsername(loginAppUser.getUsername());
        ((ServiceOrder)order).setUser(user);
        ((ServiceOrder)order).setStatus(1);
        ((ServiceOrder)order).setCreateDate(new Date());
        serviceOrderDao.save((ServiceOrder) order);
    }

    @Override
    public OrderSuccessResult getResult(Order order) {
        ServiceOrderSuccessResultFactory orderSuccessResultFactory = SpringBootUtil.getBean(ServiceOrderSuccessResultFactory.class);
        this.orderSuccessResult = orderSuccessResultFactory.getOrderSuccessResult();
        return this.orderSuccessResult.getResult(order);
    }

    private String getCode(IdService idService) {
        String flow = String.valueOf(idService.genId());
        flow = flow.substring(14,flow.length());
        String pre = DateUtils.format(new Date(), DateUtils.pattern9);
        return pre + flow;
    }
}

© 著作权归作者所有

算法之名
粉丝 48
博文 177
码字总数 265546
作品 0
广州
私信 提问
virtualbox中使用linux

配置网络 几种网络模式 网络地址转换模式 桥接模式 内部网络模式 Host-only Adapter 主机模式 centos(桥接模式) 修改网络配置文件 ifcfg-eth0, 这会*打开一个文本编辑区域。按 i 键开始编...

brivio
2014/05/11
240
0
CentOS 7 最小化安装后的注意事项(二)

二、安装ssh服务 安装在虚拟机下的Centos7想要在局域网中使用,则必须安装ssh服务。 1.查看是否安装了ssh服务: 显示结果如下,则表示已经安装,否则需要安装缺失的软件。 [图片上传失败......

Mr_Barry
2018/05/15
0
0
移动开发之设计模式-桥接模式(IOS&Android)

资源 完全参照 桥接模式|菜鸟教程 ,但不包括IOS代码 桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现...

FlanneryZJ
2018/12/19
0
0
【设计模式】桥接模式 Bridge Pattern

开篇还是引用吕振宇老师的那篇经典的文章《设计模式随笔-蜡笔与毛笔的故事》。这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了。 现在市面上卖的蜡笔很多,...

风之源
2018/08/18
0
0
桥接模式

1.1桥接模式 (1)桥接模式定义 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 (2)应用桥接模式来解决的思路 仔细分析上面的示例,根据示例的功能要求,示例的变化具有两个纬度...

ciyo_yang
2017/07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈prototype原型模式

一、原型模式简介 原型(Prototype)模式是一种对象创建型模式,他采取复制原型对象的方法来创建对象的实例。使用原型模式创建的实例,具有与原型一样的数据。 原型模式的特点: 1、由原型对...

青衣霓裳
16分钟前
6
0
shell mysql 备份

#!/bin/bash time2=$(date "+%Y-%m-%d-%H:%M:%S") /usr/local/mysql/bin/mysqldump -uroot -p ad > /usr/local/mysql/backup/"$time2".sql 变量引用原来是这么用的。......

奋斗的小牛
24分钟前
4
0
Jmeter监控Linux服务器操作

系统:Win7 64位 工具:Jmeter 4.0 要准备好的插件:JMeterPlugins-Standard-1.4.0,ServerAgent-2.2.1 解压JMeterPlugins-Standard-1.4.0.zip,将其中\lib\ext\JMeterPlugins-Standard.jar......

魔鬼妹子
24分钟前
5
0
系列文章:云原生Kubernetes日志落地方案

在Logging这块做了几年,最近1年来越来越多的同学来咨询如何为Kubernetes构建一个日志系统或者是来求助在这过程中遇到一系列问题如何解决,授人以鱼不如授人以渔,于是想把我们这些年积累的经...

Mr_zebra
25分钟前
5
0
入门必备!快速学会用Aspose.Words在表格中插入和删除列!

Aspose.Words For .Net(点击下载)是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft W...

mnrssj
30分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部