首页 > 其他分享 >设计模式(三)行为型

设计模式(三)行为型

时间:2023-05-25 12:34:58浏览次数:34  
标签:Subject 方法 void 观察者 设计模式 行为 public subject

1、策略模式

和桥梁模式很相似,但桥梁模式的耦合更低,结构更复杂一些。

 2、观察者模式

观察者模式是一种行为型设计模式,当一个对象发生改变时,所有依赖它的对象都会得到通知并自动更新。这种模式也被称为发布-订阅模式或者消息机制。

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

  1. Subject(主题):被观察的对象,它维护了所有观察者对象的列表,并提供了添加和删除观察者的方法,以及通知观察者的方法。

  2. Observer(观察者):观察主题的对象,当主题状态改变时,观察者接收到通知并进行相应的操作。

  3. ConcreteSubject(具体主题):实现了主题接口的对象,它维护了一个状态,并在状态发生改变时通知所有的观察者。

  4. ConcreteObserver(具体观察者):实现了观察者接口的对象,它存储了一个指向具体主题对象的引用,并能够接收具体主题发出的通知。

观察者模式常用于需要实现松耦合的场景,例如事件驱动系统、GUI系统中的事件监听等。它可以让对象之间的耦合度更低,并且允许动态地添加或删除观察者,从而提高系统的灵活性和扩展性。

 1 首先,需要定义主题,每个主题需要持有观察者列表的引用,用于在数据变更的时候通知各个观察者:
 2 public class Subject {
 3     private List<Observer> observers = new ArrayList<Observer>();
 4     private int state;
 5     public int getState() {
 6         return state;
 7     }
 8     public void setState(int state) {
 9         this.state = state;
10         // 数据已变更,通知观察者们
11         notifyAllObservers();
12     }
13     // 注册观察者
14     public void attach(Observer observer) {
15         observers.add(observer);
16     }
17     // 通知观察者们
18     public void notifyAllObservers() {
19         for (Observer observer : observers) {
20             observer.update();
21         }
22     }
23 }
24 
25 定义观察者接口:
26 public abstract class Observer {
27     protected Subject subject;
28     public abstract void update();
29 }
30 
31 其实如果只有一个观察者类的话,接口都不用定义了,不过,通常场景下,既然用到了观察者模式,我们就是希望一个事件出来了,会有多个不同的类需要处理相应的信息。比如,订单修改成功事件,我们希望发短信的类得到通知、发邮件的类得到通知、处理物流信息的类得到通知等。
32 
33 我们来定义具体的几个观察者类:
34 public class BinaryObserver extends Observer {
35     // 在构造方法中进行订阅主题
36     public BinaryObserver(Subject subject) {
37         this.subject = subject;
38         // 通常在构造方法中将 this 发布出去的操作一定要小心
39         this.subject.attach(this);
40     }
41     // 该方法由主题类在数据变更的时候进行调用
42     @Override
43     public void update() {
44         String result = Integer.toBinaryString(subject.getState());
45         System.out.println("订阅的数据发生变化,新的数据处理为二进制值为:" + result);
46     }
47 }
48 
49 public class HexaObserver extends Observer {
50     public HexaObserver(Subject subject) {
51         this.subject = subject;
52         this.subject.attach(this);
53     }
54     @Override
55     public void update() {
56         String result = Integer.toHexString(subject.getState()).toUpperCase();
57         System.out.println("订阅的数据发生变化,新的数据处理为十六进制值为:" + result);
58     }
59 }
60 
61 客户端使用也非常简单:
62 public static void main(String[] args) {
63     // 先定义一个主题
64     Subject subject1 = new Subject();
65     // 定义观察者
66     new BinaryObserver(subject1);
67     new HexaObserver(subject1);
68 
69     // 模拟数据变更,这个时候,观察者们的 update 方法将会被调用
70     subject.setState(11);
71 }
View Code

3、模板方法模式

在含有继承结构的代码中,模板方法模式是非常常用的。模板方法中调用了 3 个方法,其中 apply() 是抽象方法,子类必须实现它,其实模板方法中有几个抽象方法完全是自由的,我们也可以将三个方法都设置为抽象方法,让子类来实现。也就是说,模板方法只负责定义第一步应该要做什么,第二步应该做什么,第三步应该做什么,至于怎么做,由子类来实现。

public abstract class AbstractTemplate {
    // 这就是模板方法
    public void templateMethod() {
        init();
        apply(); // 这个是重点
        end(); // 可以作为钩子方法
    }

    protected void init() {
        System.out.println("init 抽象层已经实现,子类也可以选择覆写");
    }

    // 留给子类实现
    protected abstract void apply();

    protected void end() {
    }
}

  

标签:Subject,方法,void,观察者,设计模式,行为,public,subject
From: https://www.cnblogs.com/coooookie/p/17430802.html

相关文章

  • 设计模式(二)结构型
    1、代理模式创建一个代理对象来控制对另一个对象的访问,以提供额外的功能或限制。1publicinterfaceFoodService{2FoodmakeChicken();3FoodmakeNoodle();4}56publicclassFoodServiceImplimplementsFoodService{7publicFoodmakeChic......
  • Java设计模式-建造者模式
    简介建造者模式是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通过将复杂对象的构建过程分解为多个简单的步骤来实现。与其他创建型模式不同,建造者模式强调的是将构建过程与表示分离,而不是将对象与其构建方式分离......
  • 《设计模式之禅》Singleton_Pattern--单例模式
    单例模式这个模式是很有意思,确实很有意思的,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的对象:皇帝(就是那个天子)中国的历史上很少出现两个皇帝并存的......
  • 设计模式(一)创建型
    1、单例模式饿汉模式(最简单):类加载的时候就创建对象,线程安全publicclassSingleton{//首先,将构造方法私有化privateSingleton(){};//创建私有静态实例,意味着在类加载就会进行创建privatestaticSingletoninstance=newSingleton();public......
  • 设计模式
     模板方法设计模式非常重要 什么场景使用过  聚合支付  有共同行为的场景 聚合支付:银联支付支付宝支付 微信支付通过回调通知支付成功修改订单状态为成功1、暴露一个接口,提供给第三方支付回调2、多家支付回调通知参数报文都不相同,但是有共同的通知行为。......
  • 二十三天搞懂设计模式之抽象工厂模式
    文章目录抽象工厂模式1.介绍2.实现3.代码4.总结抽象工厂模式1.介绍意图:提供一个创建一系列相关或者依赖的接口,而无需指定他们具体的类何时使用:系统的产品有多于一个产品族,而系统只消费其中某一族的产品,例子如下当前有个换装游戏,进入不同的游戏场景需要选择不同的游戏套装,比......
  • 二十三天搞懂设计模式之工厂模式
    文章目录1.定义2.工厂模式2.1实现2.2第一种方式代码3.总结1.定义在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。单例也是一种工厂为什么有了new之后,还要有工厂灵活控制生产过程权限、修饰、日志2.工厂模式2.......
  • C#设计模式——上
    文章目录设计模式序言-四大发明之活字印刷——面向对象思想的胜利四大发明之活字印刷——面向对象思想的胜利第一章面试受挫——代码无错就是好?第二章代码规范、重构第三章复制VS复用第四章业务的封装第五章体会简单工厂模式的美妙设计模式序言-四大发明之活字印刷——面向......
  • Java设计模式-原型模式
    简介原型模式是一种创建型设计模式,它允许在运行时通过复制现有对象来创建新对象,而不是通过构造函数创建。这个模式的核心思想是基于一个现有的对象克隆一个新的对象,这个过程对外部世界是透明的,就像对象从未被克隆过一样。原型模式的一个关键优点是可以避免在创建对象时重复性地......
  • C# 常用设计模式有哪些
    原文地址:C#常用设计模式有哪些-C#入门教程-.NET果糖网(donet5.com)C#中常用的设计模式有很多,以下列举几个常用的:1.工厂模式(FactoryPattern)通过工厂方法创建对象,隐藏对象的实例化过程,提供灵活性和可扩展性。1publicinterfaceIAnimal2{3voidSpeak();4......