如何理解这6种常见设计模式?( 五 )

简单实现
package proxy; public class ProxyPattern { public static void main(String[] args) { Proxy proxy = new Proxy(); proxy.request(); } } //抽象主题 interface Subject { void request(); } //真实主题 class RealSubject implements Subject { public void request() { System.out.println(''访问真实主题方法...''); } } //代理 class Proxy implements Subject { private RealSubject realSubject; public void request() { if (realSubject==null) { realSubject=new RealSubject(); } preRequest(); realSubject.request(); afterRequest(); } public void preRequest() { System.out.println(''访问真实主题之前的预处理 。 ''); } public void afterRequest() { System.out.println(''访问真实主题之后的后续处理 。 ''); } }6 观察者模式(Observer)
出差在外 , 想了解孩子在家的情况 , 这时候只要加入“相亲相爱一家人”群 , 老爸老妈会经常把孩子的照片和视频发到群里 , 你要做的就是作为一个观察者 , 刷一刷群里的信息就能够了解一切了 。
观察者模式结构
观察者模式包含如下角色:

  • Subject:目标
  • ConcreteSubject:具体目标
  • Observer:观察者
  • ConcreteObserver:具体观察者
结构图:
如何理解这6种常见设计模式?
本文插图
时序图:
如何理解这6种常见设计模式?
本文插图
优缺点
  • 优点:将复杂的串行处理逻辑变为单元化的独立处理逻辑 , 被观察者只是按照自己的逻辑发出消息 , 不用关心谁来消费消息 , 每个观察者只处理自己关心的内容 。 逻辑相互隔离带来简单清爽的代码结构 。
  • 缺点:观察者较多时 , 可能会花费一定的开销来发消息 , 但这个消息可能仅一个观察者消费 。
适用场景
适用于一对多的的业务场景 , 一个对象发生变更 , 会触发N个对象做相应处理的场景 。 例如:订单调度通知 , 任务状态变化等 。
注意事项
避免观察者与被观察者之间形成循环依赖 , 可能会因此导致系统崩溃 。
简单实现
package observer; import java.util.*; public class ObserverPattern { public static void main(String[] args) { Subject subject = new ConcreteSubject(); Observer obsA = new ConcreteObserverA(); Observer obsb = new ConcreteObserverB(); subject.add(obsA); subject.add(obsB); subject.setState(0); } } //抽象目标 abstract class Subject { protected List observerList = new ArrayList(); //增加观察者方法 public void add(Observer observer) { observers.add(observer); } //删除观察者方法 public void remove(Observer observer) { observers.remove(observer); } public abstract void notify(); //通知观察者方法 } //具体目标 class ConcreteSubject extends Subject { private Integer state; public void setState(Integer state){ this.state = state; // 状态改变通知观察者 notify(); } public void notify() { System.out.println(''具体目标状态发生改变...''); System.out.println(''--------------''); for(Observer obs:observers) { obs.process(); } } } //抽象观察者 interface Observer { void process(); //具体的处理 } //具体观察者A class ConcreteObserverA implements Observer { public void process() { System.out.println(''具体观察者A处理!''); } } //具体观察者B class ConcreteObserverB implements Observer { public void process() { System.out.println(''具体观察者B处理!''); } }本文为阿里云原创内容 , 未经允许不得转载 。


推荐阅读