中介者模式(mediator)

中介者模式旨在减少代码之间的依赖,降低类之间的耦合,将代码中的互相调用改为对中介的调用。

假设用户想要购买一本书,并扣取书籍所对应的费用。以下为不使用中介者的实现。

// 书本类
public class Book
{
    public decimal Price { get; }
    public string Name { get; }
    public int Quantity { get; private set; } // 剩余数量
    
    public Book(string name, decimal price, int quantity)
    {
        Name = name;
        Price = price;
        Quantity = quantity;
    }

    public void SoldOneBook() => Quantity--;
}

// 用户类
public class User
{
    public string Name { get; }
    public decimal Amount { get; } // 余额

    public User(string name, decimal amount)
    {
        Name = name;
        Amount = amount;
    }

    public void BuyBook(Book book)
    {
        Amount -= book.Price;
        book.SoldOneBook();
    }
}

// 调用
var user = new User("张三", 100m);
var book = new Book("c#从入门到入土", 99m);
user.BuyBook(book);

以下为使用中介者的例子。

// 书本类
public class Book
{
    public decimal Price { get; }
    public string Name { get; }
    public int Quantity { get; private set; } // 剩余数量
    
    public Book(string name, decimal price, int quantity)
    {
        Name = name;
        Price = price;
        Quantity = quantity;
    }

    public void SoldOneBook() => Quantity--;
}

// 用户类
public class User
{
    public string Name { get; }
    public decimal Amount { get; } // 余额

    public User(string name, decimal amount)
    {
        Name = name;
        Amount = amount;
    }

    public void Deduction(decimal price)
    {
        Amount -= price;
    }
}

public class UserBookMediator
{
    private readonly User _user;
    private readonly Book _book;
    public UserBookMediator(User user, Book book)
    {
        _user = user;
        _book = book;
    }

    public void BuyBook()
    {
        _user.Deduction(_book.Price);
        _book.SoldOneBook();
    }
}

// 调用
var user = new User("张三", 100m);
var book = new Book("c#从入门到入土", 99m);
var mediator = new UserBookMediator(user, book);

mediator.BuyBook();