Luckylau's Blog

Keep Moving, Keep Learning


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 搜索
close
Luckylau's Blog

设计模式之命令模式

发表于 2022-05-15 | 分类于 java

​ 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的处理对象,并把该命令传给这个处理对象,该处理对象执行命令。命令模式把发出命令的责任和执行命令的责任分开,委派个不同的对象。

我们先考虑发出命令和执行命令耦合起来的情况,看有啥不好

1
2
3
4
5
6
7
8
9
10
// 以下逻辑位于“命令发出者”的方法内:
if(要画形状){
形状处理对象.画形状("圆形");
}
if(要填充颜色){
颜色处理对象.填充颜色("红色");
}
if(要组合形状){
组合处理对象.组合形状([]{"红色圆形","蓝色矩形","黄色三角形");
}

“命令发出者”要同所有的“命令执行者”维持关系(前者要有后者的所有引用),只要增加一种命令执行者,就需要修改命令发出者的代码逻辑,显然不符合“开闭”原则的吧;尤其是命令发出者如果是不开放修改的(比如位于框架中),就很难保证扩展性了;命令执行有可能失败,或者Ctrl+Z回退,这种操作显然是经常遇到的,对于”命令发出者“的逻辑复杂度来说,显然又是雪上加霜。

阅读全文 »
Luckylau's Blog

设计模式之模版方法模式

发表于 2022-05-15 | 分类于 java

​ 一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

​ 子类通常不关心全局(比如整个流程、提纲、步骤),而只负责”填空“;”填空“通过实现或重写父类的方法来实现。从父类角度,全局性的规范约束掌握在自己手中,具体来说通过模板方法来约束,从而能够尽量简化子类的复杂度。父类并不一定是抽象类,模板方法也并不一定是抽象方法。

阅读全文 »
Luckylau's Blog

设计模式之策略模式

发表于 2022-05-08 | 分类于 java

​ 策略(Strategy)模式是对算法的一种封装,是把使用算法的责任和算法本身分割开来,委托给不同的对象管理,从而可以实现算法的互换,从而一个类的行为或其算法可以在运行时更改,这种设计模式属于行为型模式。

​ 策略模式在生活中和架构设计中非常常见。比如,商场打折,对于同样一类商品,不同的时间,促销方式和打折力度是不同的,这时候,促销方式和打折力度就是策略,对于这种应用场景来说,策略需要是可以随时变更的。还有个例子,比如排序,不同的对象,其排序依据不同。对于学生而言,有时候根据身高排序安排坐位,有时候根据成绩排序安排考场,这时候把这两种排序方式独立出来是一种比较好的方法,当需要安排坐位时,就使用“按照身高排序”的策略,当需要安排考场时就使用“按照成绩排序”的策略。从而一旦有新的需求和新的策略,只需要变更另外一个策略(比如“按年龄排序”)就OK了。

阅读全文 »
Luckylau's Blog

设计模式之门面模式

发表于 2022-05-08 | 分类于 java

​ 门面模式(Facade Pattern)用于隐藏系统的复杂性,并向客户端提供一些简化访问方法和对现有系统类方法的委托调用。这种类型的设计模式属于结构型模式,用来隐藏系统的复杂性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Shape.java
public interface Shape {
void draw();
}
# Circle.java
public class Circle implements Shape {
public void draw() {
System.out.println("Draw a circle.");
}
}
# Rectangle.java
public class Rectangle implements Shape {
public void draw() {
System.out.println("Draw a ectangle.");
}
}
# Triangle.java
public class Triangle implements Shape{
public void draw() {
System.out.println("Draw a triangle.");
}
}
阅读全文 »
Luckylau's Blog

设计模式之观察者模式

发表于 2022-04-30 | 分类于 java

​ 观察者(Observer)模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,主体对象的状态变化会通知所有观察者对象。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

​ 以微信订阅号的关注和消息推送为例,无论是微信的订阅号、微博的大V、喜马拉雅的音频专辑,都可以被关注或取消关注,当有新的文章、消息、音频作品出现的时候,订阅了的粉丝都会收到消息。所以我们可以抽象出来一个共同的抽象类Publisher来实现这些公共的方法:

阅读全文 »
Luckylau's Blog

设计模式之合成模式

发表于 2022-04-30 | 分类于 java

组合模式(Composite Pattern),又叫部分整体模式,依据树形结构来组合对象,是用来表示部分以及整体层次的一种递归式结构的模式。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

以文件系统目录结构为例

无论是目录还是文件,在Linux中我们都认为是广义的“文件”,为了方便阐述,我们把这个广义的“文件”叫做Entry吧,显然目录Directory和File都是一种Entry。

阅读全文 »
123…36
Luckylau

Luckylau

人生识字忧患始

215 日志
14 分类
33 标签
GitHub Weibo
© 2017 - 2022 Luckylau
由 Hexo 强力驱动
主题 - NexT.Pisces