设计模式--中介者模式

简介

中介者模式:定义一个对象来封装一系列对象的交互,中介者模式使各个对象之间不需要相互引用,从而使得其松耦合,而且用户可以独立地改变他们之间的交互。
简单讲解:
1)中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互。
中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2)中介者模式属于行为型模式,使代码易于维护。
3)比如MVC模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介者,在前后端交互时起到来中间人的作用。

结构图如下:
在这里插入图片描述

角色

通过上面结构图,可以看出中介者中包含的角色:
1)Mediator 就是抽象中介者,定义类同事对象到中介者对象的接口。
2)Colleague 是抽象同事类。
3)ConcreteMediator 具体的中介者对象,实现抽象方法,他需要知道所有的具体的同事类,即以一个集合来管理HashMap,并接收某个同事对象消息,完成相应的任务。
4)ConcreteColleague 具体的同事类,会有很多,每个同事只知道自己的行为,而不了解其他同事类的行为(方法),但是他们都是依赖中介者对象。

简单示例

1.创建一个简单的中介者对象,设置为一个接口。

public interface IMediator {
    public void react(AbstractColleague c);
}

2.创建抽象同事类,包含一个中介者的实例。为了能够定义构造函数,将它写成了一个抽象类。

public abstract class AbstractColleague {
    protected IMediator mediator;
    public AbstractColleague(IMediator m) {
        mediator = m;
    }
    public final IMediator getMediator() {
        return mediator;
    }
}

3.创建具体的中介者对象,实现中介者接口。

public class ControllerMediator implements IMediator {
    private ViewColleague viewColleague;
    private ModelColleague modelColleague;
    public ControllerMediator setView(ViewColleague v){
        viewColleague = v;
        return this;
    }
    public ControllerMediator setModel(ModelColleague m){
        modelColleague = m;
        return this;
    }
    @Override
    public void react(AbstractColleague c) {
        if (c instanceof ViewColleague) {
            String data = modelColleague.whenClick();
            viewColleague.display(data);
        } else if (c instanceof ModelColleague) {
            viewColleague.prepareShutdown();
        } else {
            System.out.println("Not Supported Class: " + c.getClass().getName());
        }
    }
}

4.定义两个具体的协同者,他们直接需要进行某些交互的动作,但是由于中介者的存在,他们不必互相了解,只要将自身的变化告诉中介者即可。

public class ViewColleague extends AbstractColleague {
    public ViewColleague(IMediator m) {
        super(m);
    }
    public void mockClick() {
        System.out.println("View got a click action.");
        getMediator().react(this);
    }
    public void display(String data) {
        System.out.println("View got " + data + " from model.");
    }
    public void prepareShutdown(){
        System.out.println("View knows that: Model gonna shutdown, backup your data.");
    }
}

public class ModelColleague extends AbstractColleague {
    public ModelColleague(IMediator m) {
        super(m);
    }
    public String whenClick(){
        System.out.println("Model should return some data to view.");
        return "data";
    }

    public void shutdown(){
        System.out.println("Model will shutdown in 5 sec.");
        getMediator().react(this);
    }
}

5.Client(Main验证)

public class MediatorMain {
    public static void main(String[] args) {
        ControllerMediator controller = new ControllerMediator();
        ViewColleague view = new ViewColleague(controller);
        ModelColleague model = new ModelColleague(controller);
        controller.setView(view).setModel(model);
        view.mockClick();
        model.shutdown();
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值