int get shape => _shape!;
set shape(int value) {
_shape = value;
}
}
ChessShape是一个抽象类,定义了其返回的形状类型。这里我们使用1代表圆,0代表方。具体的类设计如下:
class CircleShape extends ChessShape{
CircleShape(){
shape = 1;
}
}
class RectShape extends ChessShape{
RectShape(){
shape = 2;
}
}
#### 玩家状态的切换——状态模式
游戏玩家状态的可以进行切换,如是否可以悔棋等,因此在这里使用了状态模式。

玩家类设计如下:
class UserContext {
late State _state;
State get state => _state;
UserContext(){
_state = StartState(this);
}
play() {
_state.play();
}
//悔棋只能悔棋三次
bool regretChess() {
return _state.regretChess();
}
// 认输 10步之内不能认输
bool surrender() {
return _state.surrender();
}
setState(State state){
_state = state;
}
void reset() {
_state = StartState(this);
}
}
这里对玩家的一些动作进行了限制,比如`悔棋只能悔棋三次`,`前10步不能认输`。这个玩家类在状态模式中也叫`环境类`。
随后我们设计抽象状态类:
abstract class State {
int _step = 0;
int get step => _step;
int _reg = 0;
int get reg => _reg;
UserContext _userContext;
State(UserContext userContext):_userContext = userContext;
// 悔棋只能悔棋三次
bool regretChess();
// 认输10步之内不能认输
bool surrender();
play() {
_step++;
}
}
随后设计具体的状态类:
class StartState extends State {
StartState(UserContext userContext) : super(userContext);
//悔棋只能悔棋三次
@override
bool regretChess(){
return false;
}
@override
bool surrender() {
return false;
}
@override
play() {
super.play();
if(_step >= 4) {
_userContext.setState(MidState(_userContext)…_step = _step…_reg = _reg);
}
}
}
在开始状态中,我们设置不能悔棋,也不能投降。当步数大于4时,我们进行状态转移到`MidState`。效果图如下:

class MidState extends State {
MidState(UserContext userContext) : super(userContext);
@override
int get _reg{
return super._reg;
}
//悔棋只能悔棋三次
@override
bool regretChess(){
_reg++;
if(_reg == 3) {
print(‘切换到白热化阶段’);
_userContext.setState(EndState(_userContext)…_step = _step…_reg = _reg);
}
return true;
}
@override
bool surrender() {
return true;
}
}
在这个`MidState`中,我们允许投降,也允许悔棋。当悔棋超过3次,则进入到`EndState`。效果图如下:

class EndState extends State {
EndState(UserContext userContext) : super(userContext);
//悔棋只能悔棋三次
@override
regretChess(){
return false;
}
@override
surrender() {
return true;
}
}
在`EndState`中,我们只允许投降。效果图如下:

### 3.总结
今天在复习了原有的`享元模式`上,再介绍了`桥接模式`以及`状态模式`。关于棋子的创建以及玩家的状态我们也就已经设计完成,后续我们将把悔棋、以及App主题变换加上,基本就大功告成了。
>
> 作者:Jalor
> 链接:https://juejin.cn/post/7176111304745156665
>
>
>
### 最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。

相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
#### 全套视频资料:
**一、面试合集**

**二、源码解析合集**

**三、开源框架合集**

**欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取↓↓↓**
### 设计模式学习笔记

### 设计模式系列学习视频

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
g-vb0i5ImU-1714489165152)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**