中介者模式和外观模式都是软件设计模式,但是它们的关注点不同。中介者模式关注子系统内部之间的交互,而外观模式关注外部用户与子系统之间的交互 。,,中介者模式定义了一个中介对象来封装系列对象之间的交互,使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。,,外观模式是对子系统提供统一的接口,所有的请求处理都委托给子系统完成,而中介者模式则由中心协调同事类和中心本身共同完成业务 。
在软件开发过程中,我们经常会遇到一些复杂的问题,例如对象之间的交互、数据传递等,为了解决这些问题,我们可以借鉴一些已经存在的设计模式,我们将讨论的一种设计模式是中介者模式(Mediator Pattern)。
中介者模式是一种行为型设计模式,它提供了一种在多个对象之间进行松散耦合的方法,这种模式通过引入一个中介者对象来封装一系列的对象交互,从而使得这些对象之间的通信变得更加简单和灵活。
中介者模式的主要角色有以下几个:
1、抽象主题(Abstract Mediator):定义了客户端与抽象中介者之间的接口,同时也定义了抽象中介者与具体中介者之间的接口。
2、具体中介者(Concrete Mediator):实现了抽象中介者的具体行为,负责处理客户端的请求并调用其他对象的方法。
3、抽象主题(Real Subject):定义了需要被中介者所操作的一系列业务对象。
4、具体主题(Concrete Subject):实现了抽象主题的具体行为。
下面我们通过一个实例来说明中介者模式的使用:
假设我们正在开发一个简单的学生管理系统,系统中有一个学生类(Student)和一个课程类(Course),学生可以选择课程并参加课程,为了实现学生选课的功能,我们需要在学生和课程之间建立一个中介者——选课管理器(CourseSelector),选课管理器负责处理学生的选课请求,并将这些请求转发给相应的课程对象。
我们定义一个抽象主题接口:
public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); }
我们定义一个具体主题接口:
public interface ConcreteSubject extends Subject { void attach(Observer observer); void detach(Observer observer); }
我们定义一个抽象中介者接口:
public interface Mediator extends Subject { Iterator<Observer> getObservers(); }
我们定义一个具体中介者类:
public class ConcreteMediator implements Mediator { private List<Observer> observers = new ArrayList<>(); private ConcreteSubject subject; public ConcreteMediator(ConcreteSubject subject) { this.subject = subject; } @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(subject); } } }
我们定义一个具体主题类和一个观察者类:
public class Student extends ConcreteSubject implements UpdateListener { private String name; private Course course; public Student(String name, Course course) { this.name = name; this.course = course; } @Override public void attach(Observer observer) { super.attach(observer); course.addObserver(observer); // 将观察者添加到课程对象中,以便在选课时通知它们。 } @Override public void update(ConcreteSubject subject) { System.out.println("学生 " + name + " 已选择课程 " + course.getName()); // 在选课时通知观察者。 } }
public class Course implements ConcreteSubject, UpdateListener, SubjectDataChangeListener, SubjectViewUpdateListener, SubjectDeleteListener, SubjectCreateListener, SubjectModifyListener, SubjectOperationListener, SubjectApprovalListener, SubjectDeclineListener, SubjectEvaluationListener, SubjectGradeListener, SubjectReportListener, SubjectQuizListener, SubjectExamListener, SubjectAssignmentListener, SubjectSubmissionListener, SubjectDownloadListener, SubjectUploadListener, SubjectCommentListener, SubjectReplyListener, SubjectTagListener, SubjectCategoryListener, SubjectGroupListener, SubjectAnnouncementListener, SubjectCalendarEventListener, SubjectEventNotificationListener, SubjectTaskListener, SubjectReminderListener, SubjectNavigationListener, SubjectLocationListener, SubjectSearchListener, SubjectLibraryListener, SubjectStorageListener, SubjectEmailListener, SubjectChatListener, SubjectMessagingListener, SubjectFileManagementListener, SubjectDocumentManagementListener, SubjectNotesManagementListener, SubjectContactManagementListener, SubjectProfileManagementListener, SubjectSettingsManagementListener, SubjectLogoutListener, SubjectLoginListener, SubjectRegistrationListener, SubjectAuthenticationListener, SubjectAccountManagerListener, SubjectCurrencyManagerListener, SubjectPaymentManagerListener, SubjectTicketManagerListener, SubjectTicketHistoryManagerListener, SubjectCustomerServiceManagerListener, SubjectSupportServiceManagerListener, SubjectKnowledgeBaseManagerListener, SubjectFAQManagerListener, SubjectHelpCenterManagerListener, SubjectLanguageManagerListener!"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"-"!/n@Override public void update(ConcreteSubject subject) { System.out.println(\">>\t更新学生信息 "); // TODO: 实现更新学生信息的逻辑 }