一、命令模式
定义:将“请求”封装成对象,以便使用不同的请求
特点:
● 命令模式解决了应用程序中对象的职责以及它们之间的通信方式问题
● 能够实现命令发送者和接受者之间的解耦
类型:行为型
适用场景:
● 请求调用者和请求接收者需要解耦,使得调用者和接收者不直接交互
● 需要抽象出等待执行的行为
优点:
● 降低耦合
● 容易扩展新命令或者一组命令
缺点:
● 命令的无限扩展会增加类的数量,提高系统实现复杂度。
Coding
命令接口
/**
* 命令模式接口
*/
public interface Command {
void execute();
}
实体类
/**
* 课程视频实体
*/
public class CourseVideo {
private String name;
public CourseVideo(String name) {
this.name = name;
}
public void open(){
System.out.println(name + "课程视频开放");
}
public void close(){
System.out.println(name + "课程视频关闭");
}
}
具体命令实现类一
/**
* 具体命令一
*/
public class CourseVideoOpenCommand implements Command{
private final CourseVideo courseVideo;
public CourseVideoOpenCommand(CourseVideo courseVideo) {
this.courseVideo = courseVideo;
}
@Override
public void execute() {
courseVideo.open();
}
}
具体命令实现类二
/**
* 课程视频关闭命令
*/
public class CourseVideoCloseCommand implements Command{
private CourseVideo courseVideo;
public CourseVideoCloseCommand(CourseVideo courseVideo) {
this.courseVideo = courseVideo;
}
@Override
public void execute() {
courseVideo.close();
}
}
员工类(命令的执行者)
import java.util.ArrayList;
import java.util.List;
/**
* 员工类,命令执行者
*/
public class Staff {
private List<Command> commandList = new ArrayList<>();
public void addCommand(Command command) {
commandList.add(command);
}
public void executeCommand() {
for(Command command : commandList) {
command.execute();
}
commandList.clear();
}
}
测试类
public class Design_Pattern_Test {
public static void main(String[] args) {
CourseVideo courseVideo = new CourseVideo("Java");
Command openCommand = new CourseVideoOpenCommand(courseVideo);
CourseVideoCloseCommand closeCommand = new CourseVideoCloseCommand(courseVideo);
Staff staff = new Staff();
staff.addCommand(openCommand);
staff.addCommand(closeCommand);
staff.executeCommand();
}
}
Coding体会:命令模式的核心是一个命令接口,各具体的命令实现了该接口,在执行时候,可以选择执行不同的命令。
在源码中的体现
● 线程中的Runnable接口以及各实现类
● Junit中的Test接口以及TestCase抽象类,具体的命令模式继承了TestCase抽象类。
二、中介者模式
定义:定义了一个封装一组对象如何交互的对象,通过使对象明确地相互引用来促进松散耦合,并允许独立地改变它们的交互。
类型:行为型
适用场景:
● 系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解
● 交互的公共行为,如果需要改变行为则可以增加新的中介者类
优点:
● 将一对多转化成了一对一、降低程序复杂度
● 类之间解耦
缺点:
● 中介者过多,导致系统复杂
Coding
中介者类
import java.util.Date;
/**
* 学习小组
*/
public class StudyGroup {
/**
* 显示谁说了什么话
* @param user
* @param message
*/
public static void showMessage(User user, String message) {
System.out.println(new Date() + " [" + user.getName() + "]: " + message);
}
}
用户类(与中介者打交道)
public class User {
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void sendMessage(String message) {
StudyGroup.showMessage(this, message);
}
}
测试类
public class MyTest_Mediator_Pattern {
public static void main(String[] args) {
User tom = new User("Tom");
User jack = new User("Jack");
tom.sendMessage("我是tom, 大家好");
jack.sendMessage("你好啊! 欢迎来到学习小组");
}
}
Coding体会:中介者是一个中转站,各个实现类不用和其他实现类交互,只需要和中介者交互即可,中介者可以对各个信息进行处理。
在源码中的体现
● Java.util.Timer的使用,其中对schedule方法进行了重载,最后调用的都是sched方法