🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。
毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。每种设计模式都有相应的原理和最佳实践,它们描述了我们日常开发中不断遇到的问题,以及这些问题的核心解决方法。正是因为这种实用性和通用性,设计模式才能在软件开发中广泛地得以应用。设计模式是构建稳健、可扩展和可维护软件的关键工具,为开发者们提供了解决问题的智慧和指导。
观察者模式,又称为模型-视图模式、发布-订阅模式、源-监听器模式或从属者模式,属于行为型设计模式。它巧妙地将观察者和被观察的对象分离,通过定义接口方法、抽象方法、委托或事件,实现了当目标物件状态改变时主动向观察者发出通知。这一模式有助于在应用程序中明确模块之间的边界,提高了可维护性和重用性。
观察者模式的核心思想是对象之间的松耦合,其中包括以下关键角色:
观察者模式的优点包括:
为了优化和扩展观察者模式,可以考虑以下方法:
观察者模式是一种强大的设计模式,可以用于构建松耦合、可维护和可扩展的应用程序。通过合理地设计和优化,可以充分发挥其优势。
观察者模式(Observer Pattern)中的抽象主题(Subject)是设计模式的核心组成部分,具有以下概念和作用:
update
),将状态改变的信息传递给观察者,以便观察者能够根据新状态采取适当的行动。抽象主题的作用在于将观察者模式的核心行为和接口抽象化,使得具体的被观察者类可以通过继承或实现抽象主题来轻松地实现观察者模式。同时,抽象主题也确保了被观察者和观察者之间的松耦合,因为观察者只需要依赖于抽象主题的接口,而不需要直接与具体的被观察者类交互。这有助于提高代码的可维护性、可扩展性和重用性。通过抽象主题,我们可以实现多种不同的具体主题类,每个类都可以有自己的状态和观察者列表,而不影响整体的观察者模式的
在观察者模式(Observer Pattern)中,具体主题(Concrete Subject)是被观察者的具体实现,具有以下概念和作用:
具体主题是观察者模式中的核心部分,它通过维护观察者列表和状态数据,实现了被观察者和观察者之间的解耦。具体主题的存在使得多个观察者可以同时监听和响应被观察者的状态变化,从而实现了一对多的依赖关系,同时也提高了系统的可扩展性和灵活性。
观察者模式(Observer Pattern)中的抽象观察者(Observer)是这一模式的关键组成部分,具有以下概念和作用:
抽象观察者的作用在于定义了观察者对象应该具备的通用接口,使得具体观察者可以根据需要进行定制化实现,同时确保了被观察者和观察者之间的松耦合,从而提高了系统的可维护性和扩展性。这样,可以轻松地在系统中添加、移除或替换观察者,而不需要修改被观察者的代码。这种模式通常用于构建事件处理系统、消息通知系统以及各种需要实现发布-订阅
在观察者模式(Observer Pattern)中,具体观察者(Concrete Observer)是实现了抽象观察者接口的具体类,具有以下概念和作用:
具体观察者的存在使得我们可以根据具体业务需求创建不同的观察者类,每个类都可以有自己的响应方式和逻辑。这种灵活性使得观察者模式在实际应用中非常有用,特别是在需要实现一对多的依赖关系时。
命名空间ObserverPattern中包含抽象出版社基类Publisher(主题)、中国机械工业出版社类Machine、中国农业出版社类Agriculture、读者接口IReader(观察者)、具体观察者Iori类和Jay类、图书类Book。另外为了代码更整洁,引入Extentions扩展类,方便图书和读者信息的处理。这个示例展示读者如何观察出版社发布图书的状态,并在出版社发布图书时,得到通知。
public class Book {
public string Name { get; set; }
public Book(string name) {
Name = name;
}
}
简单的图书类,仅包含一个构造函数和图书的名字属性。
public interface IReader {
void Receive(Publisher publisher, Book book);
}
读者接口,定义公开的Receive契约,并且得到出版社和图书信息。
public class Iori : IReader {
public void Receive(Publisher publisher, Book book) {
Console.WriteLine(
$"{this.ReaderName()} received {book.BookName()} from {publisher.Name}.");
}
}
public class Jay : IReader {
public void Receive(Publisher publisher, Book book) {
Console.WriteLine(
$"{this.ReaderName()} received {book.BookName()} from {publisher.Name}.");
}
}
具体读者类,Iori和Jay,一个是我的英文名,另一个则是我的偶像。
public abstract class Publisher {
private List<IReader> _readers = new List<IReader>();
public string Name { get; set; }
private const string LINE_BREAK =
"----------------------------------------" +
"----------------------------------------";
//文章排版需要,故折成2行
public void AttachReader(IReader reader) {
if (reader == null) throw new ArgumentNullException();
_readers.Add(reader);
}
public bool DetachReader(IReader reader) {
if (reader == null) throw new ArgumentNullException();
return _readers.Remove(reader);
}
protected virtual void OnPublish(Book book, DateTime publishTime) {
Console.WriteLine(
$"{Name} published {book.BookName()} at {publishTime.ToString("yyyy-MM-dd")}.");
Console.WriteLine(LINE_BREAK);
}
public void Publish(Book book, DateTime publishTime) {
OnPublish(book, publishTime);
foreach (var reader in _readers) {
if (reader != null) {
reader.Receive(this, book);
}
}
Console.WriteLine(LINE_BREAK);
}
}
抽象出版社类Publisher,即被观察者,这是整个观察者模式的核心基类。首先在内部维持对IReader列表的引用,并且可以对观察者进行增加(AttachReader)或删除(DetachReader)操作。而发布方法Publish则在出版社发布新图书时,通知所有观察者。
public class Machine : Publisher {
public Machine(string name) {
Name = name;
}
protected override void OnPublish(Book book, DateTime publishTime) {
Console.WriteLine(
$"{Name} published {book.BookName()} at {publishTime.ToString("yyyy-MM-dd")}." +
$"->Machine.OnPublish");
Console.WriteLine(LINE_BREAK);
}
}
public class Agriculture : Publisher {
public Agriculture(string name) {
Name = name;
}
}
具体出版社类Machine和Agriculture,代表中国机械出版社和中国农业出版社。
public static class Extentions {
public static string ReaderName(this IReader reader) {
return reader.ToString().Replace(nameof(ObserverPattern) + ".", "");
}
public static string BookName(this Book book) {
return "[" + book.Name + "]";
}
}
公开的静态的扩展方法类,其中ReaderName扩展处理读者名称前的命名空间,使用nameof关键字是为了支持重构。BookName扩展则用来为书名加上中括号。
public class Program {
public static void Main(string[] args) {
Publisher publisher = new Machine("China Machine Press");
var iori = new Iori();
var jay = new Jay();
publisher.AttachReader(iori);
publisher.AttachReader(jay);
publisher.Publish(new Book("How the Steel Was Tempered"), DateTime.UtcNow);
publisher.DetachReader(jay);
publisher.Publish(new Book("Jane Eyre"), DateTime.UtcNow);
publisher = new Agriculture("China Agriculture Press");
publisher.AttachReader(iori);
publisher.AttachReader(jay);
publisher.Publish(new Book("Romance of the Three Kingdoms"), DateTime.UtcNow);
Console.ReadKey();
}
}
这个是调用方的代码示例,首先创建机械工业出版社实例,再创建2个具体读者实例并订阅,最后出版社发布《钢铁是怎么炼成的》图书,2个读者都能收到发布通知。接下来演示了取消订阅和中国农业出版社的发布情况,请各位看官自行分析。以下是这个案例的输出结果:
China Machine Press published [How the Steel Was Tempered] at 2018-07-19.->Machine.OnPublish
--------------------------------------------------------------------------------
Iori received [How the Steel Was Tempered] from China Machine Press.
Jay received [How the Steel Was Tempered] from China Machine Press.
--------------------------------------------------------------------------------
China Machine Press published [Jane Eyre] at 2018-07-19.->Machine.OnPublish
--------------------------------------------------------------------------------
Iori received [Jane Eyre] from China Machine Press.
--------------------------------------------------------------------------------
China Agriculture Press published [Romance of the Three Kingdoms] at 2018-07-19.
--------------------------------------------------------------------------------
Iori received [Romance of the Three Kingdoms] from China Agriculture Press.
Jay received [Romance of the Three Kingdoms] from China Agriculture Press.
--------------------------------------------------------------------------------
观察者模式(Observer Pattern)具有许多优点,使其成为软件开发中常用的设计模式之一。以下是观察者模式的一些主要优点:
观察者模式提供了一种优雅的方式来实现对象之间的通信和协作,使系统更灵活、可维护和可扩展。它适用于许多不同的应用场景,特别是需要实现一对多关系的情况。
观察者模式(Observer Pattern)虽然具有许多优点,但也存在一些缺点,需要考虑在使用时加以注意:
使用观察者模式时需要谨慎考虑上述可能出现的缺点,并根据具体应用场景进行权衡和处理,以确保系统的稳定性、性能和可维护性。
观察者模式(Observer Pattern)适用于许多不同的场景,特别是在需要实现一对多的依赖关系以及对象状态变化通知的情况下。以下是观察者模式常见的使用场景:
观察者模式适用于任何需要对象之间松耦合通信和状态变化通知的情况。它提供了一种灵活的方式来实现对象之间的交互,同时保持系统的可维护性和扩展性。