愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
目录
第1集 备忘录设计模式介绍和应用场景
简介:备忘录设计模式介绍和应用场景
-
备忘录设计模式(Memento Pattern)
- 在不破坏封闭的前提下,捕获一个对象的内部状态,保存对象的某个状态,以便在适当的时候恢复对象,又叫做快照模式,属于行为模式
- 备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外部访问,
-
应用场景
- 玩游戏的时候肯定有存档功能,下一次登录游戏时可以从上次退出的地方继续游戏
- 棋盘类游戏的悔棋、数据库事务回滚
- 需要记录一个对象的内部状态时,为了允许用户取消不确定或者错误的操作,能够恢复到原先的状态
- 提供一个可回滚的操作,如ctrl+z、浏览器回退按钮
-
角色
- Originator: 发起者,记录当前的内部状态,并负责创建和恢复备忘录数据,允许访问返回到先前状态所需的所有数据,可以根据需要决定Memento存储自己的哪些内部状态
- Memento: 备忘录,负责存储Originator发起人对象的内部状态,在需要的时候提供发起人需要的内部状态
- Caretaker: 管理者,对备忘录进行管理、保存和提供备忘录,只能将备忘录传递给其他角色
- Originator 和 Memento属性类似
第2集 备忘录设计模式实战之游戏存档恢复
简介:备忘录设计模式案例实战
- 需求背景
小滴课堂 - 二当家小D 开发了一个游戏存档功能 拳皇97,无限生命,每次快要死的的时候就恢复成刚开始的状态
使用备忘录设计模式帮他完成
/**
* 小滴课堂,愿景:让技术不再难学 https://xdclass.net
*
* @Description 发起者,Originator 和 Memento属性类似
* @Author 二当家小D
* @Remark 有问题直接联系我,源码-笔记-技术交流群 微信 xdclass6
* @Version 1.0
**/
public class RoleOriginator {
/**
* 生命力,会下降
*/
private int live = 100;
/**
* 攻击力,会上涨
*/
private int attack = 50;
public int getLive() {
return live;
}
public void setLive(int live) {
this.live = live;
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
this.attack = attack;
}
public void display(){
System.out.println("开始=========");
System.out.println("生命力:"+live);
System.out.println("攻击力:"+attack);
System.out.println("结束=========");
}
public void fight(){
//攻击力会上涨
this.attack = attack+2;
//打架生命力会下降
this.live = live - 10;
}
/**
* 保存快照,存储状态
* @return
*/
public RoleStateMemento saveState(){
return new RoleStateMemento(live,attack);
}
/**
* 恢复
*/
public void recoveryState(RoleStateMemento memento){
this.attack = memento.getAttack();
this.live = memento.getLive();
}
}
/**
* 小滴课堂,愿景:让技术不再难学 https://xdclass.net
*
* @Description 状态管理者
* @Author 二当家小D
* @Remark 有问题直接联系我,源码-笔记-技术交流群
* @Version 1.0
**/
public class RoleStateCaretaker {
private RoleStateMemento memento;
public RoleStateMemento getMemento() {
return memento;
}
public void setMemento(RoleStateMemento memento) {
this.memento = memento;
}
}
/**
* 小滴课堂,愿景:让技术不再难学
*
* @Description 快照,备忘录
* @Author 二当家小D
* @Remark 有问题直接联系我,源码-笔记-技术交流群
* @Version 1.0
**/
public class RoleStateMemento {
/**
* 生命力,会下降
*/
private int live;
/**
* 攻击力,会上涨
*/
private int attack ;
public RoleStateMemento(int live, int attack) {
this.live = live;
this.attack = attack;
}
public int getLive() {
return live;
}
public void setLive(int live) {
this.live = live;
}
public int getAttack() {
return attack;
}
public void setAttack(int attack) {
this.attack = attack;
}
}
//使用
public static void main(String[] args) {
RoleOriginator role = new RoleOriginator();
role.display();
role.fight();
role.display();
System.out.println("保存上面的快照");
RoleStateCaretaker caretaker = new RoleStateCaretaker();
caretaker.setMemento(role.saveState());
role.fight();
role.fight();
role.fight();
role.fight();
role.display();
System.out.println("准备恢复快照");
role.recoveryState(caretaker.getMemento());
role.display();
}
-
优点
- 给用户提供了一种可以恢复状态的机制
- 实现了信息的封装,使得用户不需要关心状态的保存细节
-
缺点
- 消耗更多的资源,而且每一次保存都会消耗一定的内存
第3集 状态设计模式介绍和应用场景
简介:状态设计模式介绍和应用场景
-
状态设计模式(State Pattern)
- 对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为 ,属于行为型模式
- 允许一个对象在其内部状态改变时改变它的行为
- 状态模式是策略模式的孪生兄弟,它们的UML图是一样的,但实际上解决的是不同情况的两种场景问题
- 工作中用的不多,基本策略模式比较多
-
应用场景
- 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为
- 代码中包含大量与对象状态有关的条件语句 ,比如一个操作中含有庞大的多分支的条件if else语句,且这些分支依赖于该对象的状态
- 电商订单状态:未支付、已支付、派送中,收货完成等状态,各个状态下处理不同的事情
-
角色
- Context 上下文: 定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理
- State 抽象状态类: 定义一个接口以封装与Context的一个特定状态相关的行为。
- ConcreteState具体状态类: 实现抽象状态定义的接口。
第4集 状态设计模式案例实战之电商系统订单状态处理
简介:状态设计模式案例实战
- 业务需求
电商订单状态流转,每步都有不同的操作内容: 新建订单/已支付/已发货/确认收货
- 编码
public interface State {
void handle();
}
public class NewOrderState implements State{
@Override
public void handle() {
System.out.println("新订单,未支付");
System.out.println("调用商户客服服务,有新订单\n");
}
}
public class PayOrderState implements State{
@Override
public void handle() {
System.out.println("新订单已经支付");
System.out.println("调用商户客服服务,订单已经支付");
System.out.println("调用物流服务,未发货\n");
}
}
public class SendOrderState implements State{
@Override
public void handle() {
System.out.println("订单已经发货");
System.out.println("调用短信服务,告诉用户已经发货");
System.out.println("更新物流信息\n");
}
}
/**
* 小滴课堂,愿景:让技术不再难学 https://xdclass.net
*
* @Description
* @Author 二当家小D
* @Remark 有问题直接联系我,源码-笔记-技术交流群 微信 xdclass6
* @Version 1.0
**/
public class OrderContext {
private State state;
public OrderContext(){}
public void setState(State state) {
this.state = state;
System.out.println("订单状态边更!!");
this.state.handle();
}
}
//使用
public static void main(String[] args) {
OrderContext orderContext = new OrderContext();
orderContext.setState(new NewOrderState());
orderContext.setState(new PayOrderState());
orderContext.setState(new SendOrderState());
}
-
优点
- 只需要改变对象状态即可改变对象的行为
- 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数
-
缺点
- 状态模式的使用会增加系统类和对象的个数。
- 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱
- 状态模式对“开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码
-
状态设计和策略模式的区别
-
UML图一样,结构基本类似
-
状态模式重点在各状态之间的切换,从而做不同的事情
-
策略模式更侧重于根据具体情况选择策略,并不涉及切换
-
状态模式不同状态下做的事情不同,而策略模式做的都是同一件事。例如,聚合支付平台,有支付宝、微信支付、银联支付,虽然策略不同,但最终做的事情都是支付
-
状态模式,各个状态的同一方法做的是不同的事,不能互相替换
-
第5集 不常用的设计模式和学习建议
简介:介绍不常用的设计模式和学习建议
-
设计模式没有说一定是多少个,技术演进,模式也在不断更新
- head first 设计模式、gof
-
像有些很少用的设计模式
- 访问者模式、解释器模式、中介模式等,基本都用不上,简单知道就行的了
-
网上还有很多其他模式
- MVC模式, Model-View-Controller(模型-视图-控制器)、传输模式等
- 也有很多都是我们前面讲的模式组合或者变种
-
多看源码、网上的博文,多看几遍设计模式,这样反复才可以真正的体会到设计模式的好处
- 一定不能固定死板
-
公司里面如果有重构需求(业务发展快的公司很多这样的需求,多发现原先存在的问题和结合设计模式的原则)