中介者模式是一种行为型设计模式,用于减少对象之间的直接耦合,并将它们的通信集中在一个中介对象中。这个中介对象负责协调对象之间的交互,从而使对象之间的关系更加松散。
在本文中,我们将通过Java代码举例说明中介者模式,并介绍在Android开发中实际应用中的一些例子和源码解析。
示例
在中介者模式中,有两种角色:中介者和同事。中介者负责协调同事之间的交互,而同事则通过中介者来交互。以下是一个简单的示例,说明中介者如何在两个同事之间进行交互:
// 定义同事接口
public interface Colleague {void send(String message);void receive(String message);
}// 定义中介者接口
public interface Mediator {void addColleague(Colleague colleague);void send(String message, Colleague colleague);
}// 定义具体同事类
public class ConcreteColleague implements Colleague {private Mediator mediator;private String name;public ConcreteColleague(Mediator mediator, String name) {this.mediator = mediator;this.name = name;}@Overridepublic void send(String message) {mediator.send(message, this);}@Overridepublic void receive(String message) {System.out.println(name + " received message: " + message);}
}// 定义具体中介者类
public class ConcreteMediator implements Mediator {private List colleagues = new ArrayList<>();@Overridepublic void addColleague(Colleague colleague) {colleagues.add(colleague);}@Overridepublic void send(String message, Colleague sender) {for (Colleague colleague : colleagues) {if (colleague != sender) {colleague.receive(message);}}}
}// 客户端代码
public class Client {public static void main(String[] args) {Mediator mediator = new ConcreteMediator();Colleague colleague1 = new ConcreteColleague(mediator, "Colleague 1");Colleague colleague2 = new ConcreteColleague(mediator, "Colleague 2");mediator.addColleague(colleague1);mediator.addColleague(colleague2);colleague1.send("Hello, Colleague 2!");}
}
在这个示例中,我们定义了一个Colleague接口和一个Mediator接口,以及具体的同事类ConcreteColleague和具体的中介者类ConcreteMediator。在客户端代码中,我们创建了两个具体同事对象,并将它们添加到中介者对象中。然后,我们调用其中一个同事对象的send方法,向另一个同事对象发送一条消息。中介者接收到这条消息后,将它转发给所有其他的同事对象。
在这个示例中,中介者对象负责协调同事之间的交互,将它们的通信集中在一个中介对象中,从而实现了对象之间的松散耦合。这种设计模式非常适用于需要协调多个对象之间交互的场景,特别是当对象之间的交互复杂或难以维护时。
在Android开发中,中介者模式有多种应用。以下是一些实际应用中的例子:
1、EventBus
EventBus是一个开源的Android事件发布/订阅库,它使用了中介者模式。在EventBus中,事件发布者只需要发布事件,而不需要知道谁将接收它,而订阅者只需要订阅它们感兴趣的事件,而不需要知道是谁发布了它。这样,发布者和订阅者之间的交互就由EventBus作为中介来处理,从而实现了对象之间的松散耦合。
以下是一个简单的示例,展示了如何使用EventBus在两个Activity之间传递数据:
// 定义事件类
public class DataEvent {private String data;public DataEvent(String data) {this.data = data;}public String getData() {return data;}
}// 发布事件
EventBus.getDefault().post(new DataEvent("Hello, SecondActivity!"));// 订阅事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onDataEvent(DataEvent event) {String data = event.getData();textView.setText(data);
}
在这个示例中,我们定义了一个DataEvent事件类,并使用EventBus将它发布到默认的事件总线上。在另一个Activity中,我们订阅了这个事件,并在onDataEvent方法中接收到数据,并将它显示在TextView中。
2、ViewModel
在Android开发中,ViewModel是一个非常重要的组件,用于管理应用程序的界面状态和数据。ViewModel使用了中介者模式来协调视图和模型之间的交互,从而实现了松散耦合。
以下是一个简单的示例,展示了如何使用ViewModel来管理Activity的数据:
public class MyViewModel extends ViewModel {private MutableLiveData data = new MutableLiveData<>();public void setData(String newData) {data.setValue(newData);}public LiveData getData() {return data;}
}// 在Activity中使用ViewModel
public class MainActivity extends AppCompatActivity {private MyViewModel viewModel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewModel = new ViewModelProvider(this).get(MyViewModel.class);viewModel.getData().observe(this, new Observer() {@Overridepublic void onChanged(String newData) {textView.setText(newData);}});}public void onButtonClicked(View view) {viewModel.setData("Hello, ViewModel!");}
}
在这个示例中,我们定义了一个MyViewModel类,它继承自ViewModel类,并使用LiveData来管理数据。在Activity中,我们通过ViewModelProvider来获取MyViewModel实例,并使用LiveData的observe方法来监听数据的变化。当用户点击按钮时,我们调用MyViewModel的setData方法来更新数据,从而触发LiveData的onChanged方法,进而更新界面上的TextView。
中介者模式具有以下优点:
中介者模式也有以下缺点:
总结
中介者模式是一种非常有用的设计模式,它可以将对象之间的交互解耦,并集中控制交互过程。在Android开发中,中介者模式有多种应用,例如EventBus和ViewModel。使用中介者模式可以使得Android应用更加灵活、可扩展和易于维护。
下一篇:【MyBatis】篇一.