NOTE
6.20 中介者模式
1. 定义 适用于多个对象之间相互交互耦合度太高.如mvc中的c 2. uml 3. Java 3.1. client 3.2. 中介者 3.3. 交互对象 4. Golang 4.1. 中介者 4.2. 交互对象 4.3. client
这是历史学习笔记,可能存在过时或不完整的理解。
1. 定义
适用于多个对象之间相互交互耦合度太高.如mvc中的c
2. uml
3. Java
3.1. client
public class Client
{
public static void main(String[] args)
{
Mediator mediator = new Boss();
Dev dev = new Dev(mediator);
Finacial finacial = new Finacial(mediator);
dev.selfDo();
//向中介发出请求
dev.outDo("finacial");
}
}
3.2. 中介者
public interface Mediator
{
void register(String dname,Department d);
void command(String dname);
}
public class Boss implements Mediator
{
private Map<String, Department> map = new HashMap<>();
@Override
public void register(String dname, Department d)
{
map.put(dname, d);
}
@Override
public void command(String dname)
{
map.get(dname).selfDo();
}
}
3.3. 交互对象
public interface Department
{
void selfDo();
void outDo(String name);
}
public class Dev implements Department
{
private Mediator mediator;
public Dev(Mediator mediator)
{
this.mediator = mediator;
this.mediator.register("dev", this);
}
@Override
public void selfDo()
{
System.out.println("开发项目");
}
@Override
public void outDo(String name)
{
System.out.println("开发部需要钱");
mediator.command(name);
}
}
public class Finacial implements Department
{
private Mediator mediator;
public Finacial(Mediator mediator)
{
this.mediator = mediator;
this.mediator.register("finacial", this);
}
@Override
public void selfDo()
{
System.out.println("财政部发钱");
}
@Override
public void outDo(String name)
{
System.out.println("有谁需要钱么?");
this.mediator.command(name);
}
}
4. Golang
4.1. 中介者
/*中介者--计算机,处理CDDriver、CPU、VideoCard、SoundCard的交互*/
type Mediator struct {
CD *CDDriver
CPU *CPU
Video *VideoCard
Sound *SoundCard
}
//单例模式
var mediator *Mediator
var once sync.Once
func GetMediatorInstance() *Mediator {
once.Do(func() {
mediator = &Mediator{}
})
return mediator
}
//中介者处理各个组件的交互
func (m *Mediator) changed(i interface{}) {
switch inst := i.(type) {
case *CDDriver:
m.CPU.Process(inst.Data)
case *CPU:
m.Sound.Play(inst.Sound)
m.Video.Display(inst.Video)
}
}
4.2. 交互对象
/*CD驱动器负责读取数据*/
type CDDriver struct {
Data string
}
func (c *CDDriver) ReadData() {
c.Data = "music,image"
fmt.Printf("CDDriver: reading data %s\n", c.Data)
GetMediatorInstance().changed(c)
}
/*CPU负责把数据分成声音和视频*/
type CPU struct {
Video string
Sound string
}
func (c *CPU) Process(data string) {
sp := strings.Split(data, ",")
c.Sound = sp[0]
c.Video = sp[1]
fmt.Printf("CPU: split data with Sound %s, Video %s\n", c.Sound, c.Video)
GetMediatorInstance().changed(c)
}
/*显卡负责处理视频*/
type VideoCard struct {
Data string
}
func (v *VideoCard) Display(data string) {
v.Data = data
fmt.Printf("VideoCard: display %s\n", v.Data)
GetMediatorInstance().changed(v)
}
/*声卡负责处理声音*/
type SoundCard struct {
Data string
}
func (s *SoundCard) Play(data string) {
s.Data = data
fmt.Printf("SoundCard: play %s\n", s.Data)
GetMediatorInstance().changed(s)
}
4.3. client
func main() {
mediator := 中介者.GetMediatorInstance()
mediator.CD = &中介者.CDDriver{}
mediator.CPU = &中介者.CPU{}
mediator.Video = &中介者.VideoCard{}
mediator.Sound = &中介者.SoundCard{}
mediator.CD.ReadData()
}
讨论
使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看