设计模式
1、模板方法设计模式
1. 定义
模板方法是行为设计模式的一种。准备一个抽象类,在该类中定义抽象方法和模板方法(具体方法),在具体方法中定义业务的实现步骤,这些步骤是固定的,但是中间某些步骤具体行为是待定的,在不同的场景下行为不同,需要不同的子类来实现抽象方法,从而对业务逻辑有不同的实现。
2. 角色
-
抽象类/抽象模板:负责给出一个业务的步骤,由一个模板方法和若干个抽象方法构成。
-
模板方法:定义业务的步骤,按照某种顺序调用其中的抽象方法,这些抽象方法在不同场景下由不同子类给出具体实现。
-
抽象方法:不同场景下由不同子类给出具体实现,并由模板方法按照逻辑依次调用。
-
-
具体子类/具体实现:
-
可以重写父类中的具体方法,以改变模板方法的执行内容。
-
现抽象类中的抽象方法。
-
3. 案例
1. 案例1:手动实现
// 抽象类,表示游戏
public abstract class Game {
// 模板方法,定义了游戏流程的框架
public final void play() {
startGame();
playGame(); // 这一步是抽象的,由子类实现
endGame();
}
// 抽象方法,子类必须实现
protected abstract void playGame();
// 具体方法,定义了游戏开始的操作
protected void startGame() {
System.out.println("游戏开始!");
}
// 具体方法,定义了游戏结束的操作
protected void endGame() {
System.out.println("游戏结束!");
}
}
// 具体子类,表示一个具体的游戏
public class FootballGame extends Game {
// 实现抽象方法,定义足球游戏的玩法
@Override
protected void playGame() {
System.out.println("进行足球比赛...");
}
}
// 具体子类,表示一个具体的游戏
public class BasktabllGame extends Game {
// 实现抽象方法,定义篮球游戏的玩法
@Override
protected void playGame() {
System.out.println("进行篮球比赛...");
}
}
// 使用
public class Main {
public static void main(String[] args) {
Game game = new FootballGame();
game.play(); // 输出:游戏开始!进行足球比赛...游戏结束!
Game game = new BasktabllGame();
game.play(); // 输出:游戏开始!进行篮球比赛...游戏结束!
}
}
2. 案例2:MyBatis中的Executor
-
==抽象模板角色:BeseExecutor==
-
模板方法:update、query、queryCursor......
-
抽象方法:doUpdate、doQuery......
-
-
==具体子类角色==:各种Executor
不同子类给出不同实现
2、建造模式
1. 定义
建造模式(Builder Pattern)是一种对象构建的设计模式,它主要将一个复杂对象的构建过程与其表示过程分离,从而使得同样的构建过程可以创建出不同的表示。
2. 角色
抽象建造者(Builder)角色:给 出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者 (ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(buildPart1和 buildPart2),另一种是返还结构方法(retrieveResult)。一般来说,产品所包含的零件数目与建造方法的数目相符。换言之,有多少 零件,就有多少相应的建造方法。
具体建造者(ConcreteBuilder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。2.在建造过程完成后,提供产品的实例。
导演者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。
产品(Product)角色:产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。
==注意:真正实现时,可以省略抽象建造器,省略导演角色。==
产品角色:建造器建造的东西
具体的建造器角色: 包含了产品的所有属性,和造产品中属性的方法(每一个方法都返回this)+ 返回产品的方法(build)。
3.案例
1.案例1:MyBatis中的Environment
-
产品:Environment
-
具体建造器:Environment.Builder
2.案例2:MyBatis中的MappedStatement
-
产品:MappedStatement
-
建造器:MappedStatement.Builder
建造产品中属性的方法:
返回产品的方法: