中介者模式旨在减少代码之间的依赖,降低类之间的耦合,将代码中的互相调用改为对中介的调用。
假设用户想要购买一本书,并扣取书籍所对应的费用。以下为不使用中介者的实现。
// 书本类
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();