一、设计模式之观察者模式
定义:对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
核心原理:
1.被观察者中维护一个观察者对象列表
2.观察者可新增可可移除。
需要角色:
1.抽象观察者
2.抽象被观察者
3.具体观察者
4.具体被观察者
关系如下:
实施步骤:
抽象被观察者:
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
抽象观察者:
public interface Observer {
public void update(String message);
}
具体被观察者
public class WechatServer implements Subject {
private List<Observer> list;
private String message;
public WechatServer() {
list = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer o) {
list.add(o);
}
@Override
public void removeObserver(Observer o) {
if (!list.isEmpty()) {
list.remove(o);
}
}
@Override
public void notifyObserver() {
for (Observer o : list) {
o.update(message);
}
}
public void setInfomation(String s) {
this.message = s;
System.out.println("被观察者更新消息: " + s);
// 消息更新,通知所有观察者
notifyObserver();
}
}
具体观察者
public class User implements Observer {
private String name;
private String message;
public User(String name) {
this.name = name;
}
@Override
public void update(String message) {
this.message = message;
read();
}
public void read() {
System.out.println(name + " 收到推送消息: " + message);
}
}
演示:
public class MainTest {
public static void main(String[] args) {
WechatServer server = new WechatServer();
Observer userZhang = new User("ZhangSan");
Observer userLi = new User("LiSi");
Observer userWang = new User("WangWu");
server.registerObserver(userZhang);
server.registerObserver(userLi);
server.registerObserver(userWang);
server.setInfomation(" 我第一次变化了!");
System.out.println("----------------------------------------------");
server.removeObserver(userZhang);
server.setInfomation("我第二次变化了!");
}
}
二、23种设计模式分类
JAVA中的23种设计模式可以分为三大类,包括创建型模式、结构型模式和行为型模式。
创建型模式是用于处理对象的创建过程的模式,包括工厂方法模式、抽象工厂模式、建造者模式、原型模式和单例模式。这些模式关注的是对象的创建策略,通过将对象的创建与使用分离,提高了代码的灵活性和可维护性。
结构型模式是用于处理类或对象的组合,包括适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式。这些模式通过改变对象组合的方式,使得代码更加灵活,易于扩展和维护。
行为型模式是用于处理对象之间的交互和职责分配,包括解释器模式、模板方法模式、责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式和访问者模式。这些模式通过改变对象之间的交互方式,使得代码更加清晰,易于理解和维护。
三、JAVA中的23种设计模式及其应用场景的总结:
1. 创建型模式:解决对象的创建问题。
工厂方法模式:定义一个用于创建对象的最佳方式。当一个类不知道它所必须创建的对象时,或者当一个类希望由它的客户端来指定它所创建的对象时,应该使用工厂方法模式。
抽象工厂模式:提供一个接口,用于创建相关或依赖对象的系列,而不需要指定实际实现类。
建造者模式:提供了一种构建对象的最佳方式。将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
原型模式:通过克隆来创建对象,避免了通过new关键字显式调用构造函数的开销。
单例模式:确保一个类只有一个实例,并提供一个全局访问点。
2. 结构型模式:解决对象组合问题。
适配器模式:将一个类的接口转换成客户端所期望的另一个接口形式。适配器让原本不兼容的类可以合作无间。
桥接模式:将抽象部分与实现部分分离,使它们都可以独立变化。
组合模式:允许你将对象组合成树形结构,以表示部分整体层次结构,使得客户端以统一的方式处理单个对象以及对象的组合。
装饰者模式:动态地给一个对象增加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更为灵活。
外观模式:为子系统中的一组接口提供一个一致的界面,通过这个界面,客户端不需要了解实现子系统的具体类,而是用共同的接口与子系统交互。
享元模式:用于在大量对象的情况下减少内存消耗。通过共享对象来避免重复的对象实例,从而节省系统资源。
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
3. 行为型模式:解决对象之间的交互问题。
解释器模式:提供了一种构建解析器和解释器的模式。给定一个语言,定义它的文法的一种表示,并定义一个解析器数据结构,这个解析器能根据文法进行解析。
模板方法模式:定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现。模板方法使一个方法的多步操作过程既不暴露给其他类也不需要重复代码,使得子类可以在不改变算法结构的情况下重定义某些步骤的实现。
责任链模式:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
命令模式:将请求封装为一个对象,从而让你使用不同的请求把客户端与服务端进行解耦。
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而不需要暴露该对象的内部表示。
中介者模式:用一个中介对象来封装一系列的对象交互,使各对象之间解耦。
备忘录模式:在不破坏封装性的前提下捕获一个对象的内部状态并将其保存为对象引用,以后可以恢复对象到这个状态。
观察者模式:定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。
状态模式:允许一个对象在其内部状态改变时改变其行为。
策略模式:定义了一系列的算法,并将每一个算法封装起来,而且使它们可以互相替换。策略模式让算法独立于使用它的客户。
访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各类的前提下定义新的操作。
以上是JAVA中的23种设计模式的总结和应用场景详解,这些设计模式在软件开发中有着广泛的应用,可以帮助开发者编写更加高效、灵活和可维护的代码。一