贯穿设计模式-状态模式+观察者模式

代码

样例所有代码可以https://github.com/WeiXiao-Hyy/Design-Patterns获取
PS:一开始画图的时候用的PPT,但是感觉还是应该专业一点,还是换成了staruml,果然用起来顺手多了。

需求

电商的订单有很多状态如:订单初始化(OrderCreate),订单未付款(OrderWaitPay),订单未发货(OrderWaitSend),等待发货(OrderWaitReceive),订单收到已确认(OrderFinish)等等

其中状态的转化可以使用状态模式来进行设计,同时状态的转化需要作出对应的操作,比如订单付款之后需要使用异步消息通知店家系统进行发货等等,则需要使用到观察者模式

状态模式-有状态实现

在这里插入图片描述

//此处Component有问题,会导致只能创建一个订单,因此将Context转化为一个无状态的类
@Component
public class DeprecatedOrderContext {

    //引入抽象状态,用于状态方法的调用
    @Setter
    private DeprecatedAbstractOrderState currentStatus;
    ......
}

但是这里有一个问题,如果在Context中保存了抽象的状态类(是一个有状态的Context),那么只能支持一个订单状态的转化(因为在状态转化中currentState需要保存当前的订单状态,但在多并发的场景下不能只用一个Context,应该为一个订单一个Context)为了解决以上问题引入了无状态的Context。

状态模式-无状态

在这里插入图片描述

@Component
public class DeprecatedOrderContext {
    @Autowired
    private DeprecatedCreateOrder deprecatedCreateOrder;

    @Autowired
    private DeprecatedPayOrder deprecatedPayOrder;

    @Autowired
    private DeprecatedSendOrder deprecatedSendOrder;

    @Autowired
    private DeprecatedReceiveOrder deprecatedReceiveOrder;
    ......
}

观察者模式

Subject为被观察者,则为DeprecatedAbstractOrderState类
+subject:代表着关联关系,在Subject中关联观察者
在这里插入图片描述

public abstract class DeprecatedAbstractOrderState {
    //在SpringBoot框架中无法优雅地将几个观察者注入到List中去
    protected final List<DeprecatedAbstractObserver> observerList = new Vector<>();

    public void addObserver(DeprecatedAbstractObserver observer) {
        this.observerList.add(observer);
    }

    public void removeObserver(DeprecatedAbstractObserver observer) {
        this.observerList.remove(observer);
    }

    public void notifyObserver(String orderId, String orderState) {
        for (DeprecatedAbstractObserver observer : observerList) {
            observer.orderStateHandler(orderId, orderState);
        }
    }
}

参考书籍

《贯穿设计模式-用一个电商项目详解设计模式》

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
环境:Windows XP professional, JDK 1.6, Eclipse 3.3 Europa. 我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--参见本人的“第一个C#程序Hello World ”资源)来看,Java Swing编程是纯粹的OO语言、是一种非常优雅的编程语言(本人认为)--而C#的学习好像非常强调所谓的OO思想,但是不是知道是什么OO思想?(个人观点,请勿激动)。 该示例是翻写一老外Observer Pattern的例子,本人觉得该示例是对该模式的非常精典的说明,于是花点功夫来翻写它,因为他的代码没有注释说明该模式设计思想怎样体现在代码中去,所以,本人结合代码注释了关键代码的中文意义说明作者怎样表示该设计模式的,以方便Java程序员阅读和理解代码,从而理解该设计模式的思想(本人的注释非常详尽)。 目的,本人认为,作为Java程序员--不是指只会使用JBuilder(或者Websphare等)工具拖拽的java操作员--我们指至少能使用Eclipse工具书写Swing代码的Java编程员,或者使用ant工具编程的Java程序员,应该熟练掌握该设计模式!因为该设计模式贯穿Swing框架的始终。 阅读对象:本锦江中心中从S1阶段就想成为一个Java程序员的学员,并且在S1阶段已经非常认真的学习Java编程的学员。 注:不过该代码应该是本锦江中心Y2阶段Java方向学习的学员的参考代码,因为,该代码是由Y2阶段本教员会讲解。
设计模式(Patterns in Java) Java 提供了丰富的API,同时又有强大的数据库系统作底层支持,那么我们的编程似乎 变成了类似积木的简单"拼凑"和调用,甚至有人提倡"蓝领程序员",这些都是对现代编 程技术的不了解所至. 在真正可复用的面向对象编程中,GoF 的《设计模式》为我们提供了一套可复用的面向对 象技术,再配合Refactoring(重构方法),所以很少存在简单重复的工作,加上Java 代码 的精炼性和面向对象纯洁性(设计模式是java 的灵魂),编程工作将变成一个让你时刻体 验创造快感的激动人心的过程. 为能和大家能共同探讨"设计模式",我将自己在学习中的心得写下来,只是想帮助更多 人更容易理解GoF 的《设计模式》。由于原著都是以C++为例, 以Java 为例的设计模式 基本又都以图形应用为例,而我们更关心Java 在中间件等服务器方面的应用,因此,本站 所有实例都是非图形应用,并且顺带剖析Jive 论坛系统.同时为降低理解难度,尽量避 免使用UML 图. 如果你有一定的面向对象编程经验,你会发现其中某些设计模式你已经无意识的使用过 了;如果你是一个新手,那么从开始就培养自己良好的编程习惯(让你的的程序使用通用 的模式,便于他人理解;让你自己减少重复性的编程工作),这无疑是成为一个优秀程序 员的必备条件. 整个设计模式贯穿一个原理:面对接口编程,而不是面对实现.目标原则是:降低耦合,增 强灵活性.

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WeiXiao_Hyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值