观察者模式和开闭原则

观察者模式:定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新。

观察者模式包含以下4个角色:

Subject(目标)

ConcreteSubject(具体目标)

Observer(观察者)

ConcreteObserver(具体观察者)

典型实现如下:

import java.util.*;

public abstract class Subject {

//定义一个观察者集合用于存储所有观察者对象

protected ArrayList observers<Observer> = new ArrayList();


//注册方法,用于向观察者集合中增加一个观察者

public void attach(Observer observer) {

    observers.add(observer);

}


//注销方法,用于在观察者集合中删除一个观察者

public void detach(Observer observer) {

    observers.remove(observer);

}


//声明抽象通知方法

__________①_________________

}

典型的具体目标类代码:

public class ConcreteSubject extends Subject {

//实现通知方法

public void notify() {

    //遍历观察者集合,调用每一个观察者的响应方法

    for(Object obs:observers) {

        ((Observer)obs).____②_____;

    }

}

}

典型的抽象观察者代码:

public interface Observer {

//声明响应方法

public void update();

}

典型的具体观察者代码:

public class ConcreteObserver implements Observer {

//实现响应方法

public void update() {

    //具体响应代码

}

}
image
在观察者模式(Observer Pattern)中,模型(Model)通常是观察目标(Subject),而视图(View)是观察者(Observer)。这种模式在MVC(Model-View-Controller)架构中特别常见,用于实现模型和视图之间的解耦。

观察者模式的基本概念:
观察者(Observer):定义了对观察目标的更新方法,当观察目标的状态发生变化时,观察者会收到通知并执行相应的更新操作。在MVC中,视图通常扮演这个角色。
观察目标(Subject):也称为被观察者或主题,它维护一个观察者列表,并在其状态发生变化时通知所有注册的观察者。在MVC中,模型通常是观察目标。

image
观察者模式是否符合开闭原则
添加观察者只需要添加一个类就行
观察者和目标是没有关联的,是通过抽象类关联的 开闭原则要么抽象要么聚合

image

开闭原则

开闭原则实现的策略除了抽象还有什么?
开闭原则是面向对象设计的核心原则之一,除了通过抽象实现外,还可以通过多种策略来实现这一原则,使得软件系统对于扩展开放,而对修改关闭。下面是一些实现开闭原则的常用策略:

  1. 多态

    • 多态允许通过基类或接口定义一个共通的接口,而由各个子类以不同的方式实现这些接口。这样,当软件需要新功能时,可以通过添加新的子类来扩展功能,基类或接口不需要做任何修改。
  2. 组合和聚合

    • 优先使用组合或聚合而不是继承。在设计时可以将多个对象组合或聚合在一起工作,而这些对象可以独立于彼此变化和扩展。通过组合或聚合关系,新的功能可以通过添加新的对象来实现,而不必修改现有的类。
  3. 策略模式

    • 策略模式允许在运行时选择算法的行为。通过定义算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。这样可以在不修改客户代码的情况下增加新的算法。
  4. 工厂模式和抽象工厂模式

    • 利用工厂模式和抽象工厂模式可以创建一个接口用于创建对象,而让子类决定实例化哪一个类。这样的模式使一个类的实例化延迟到其子类,从而实现依赖的抽象而不是具体实现,有利于系统的扩展和维护。
  5. 依赖倒置原则

    • 高层模块不应该依赖低层模块,两者都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象。这个原则是开闭原则的基石,通过依赖抽象而非具体实现,可以在不修改高层模块的情况下改变和扩展低层模块的实现。
  6. 模板方法模式

    • 在模板方法模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模板帮助遵守开闭原则。

这些策略不仅帮助设计符合开闭原则的系统,还有助于提高系统的灵活性和可维护性,使系统更容易应对未来的变化。

posted @ 2024-06-03 09:18  LinaBell  阅读(31)  评论(0)    收藏  举报