常见设计模式说明和代码实践

一,观察者模式:

   定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,要考虑到易用和低耦合,保证高度的协作。

 

1,缺点 

  1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

  2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

  3、观察者模式只是知道观察目标发生了变化,不能知道发送变化的原因。

 

2,应用场景:

   1,Android源码中也有很多使用了观察者模式,比如OnClickListener、ContentObserver

    2,系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

 

3,类图结构:

核心代码是在被观察对象(Subject )内有一个 ArrayList<Oberver>存放观察者们,构成关联关系。

   

 

 

4、代码实践:

例子:单的例子就是一个天气系统,当天气变化(WeatherData)时必须在展示给公众的视图中进行反映。这个天气数据对象是一个主体,而不同的视图(StatisticsDisplay 统计数据展示,CurrentConditionsDisplay当前天气展示 )是观察者。


Subject:
public class WeatherData implements Subject {
    private List<Observer> observers;   // 关联关系,多个观察者对象
    private float temperature;
    private float humidity;
    private float pressure;

    public WeatherData() {
        observers = new ArrayList<>();
    }

    public void setMeasurements(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        notifyObserver();    //天气数据发送变化,通知到"观察者" 
    }

    @Override
    public void resisterObserver(Observer o) {
        observers.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        int i = observers.indexOf(o);
        if (i >= 0) {
            observers.remove(i);
        }
    }

    @Override
    public void notifyObserver() {
        for (Observer o : observers) {
            o.update(temperature, humidity, pressure);
        }
    }
}

Observer:

public class StatisticsDisplay implements Observer {

    public StatisticsDisplay(Subject weatherData) {
        weatherData.resisterObserver(this);      //创建 Oberver时,自动绑定到Subject.
    }

    @Override
    public void update(float temp, float humidity, float pressure) {
        System.out.println("StatisticsDisplay.update: " + temp + " " + humidity + " " + pressure);
    }
}

 

5,过程说明:

  1,“被观察者”和多个观察器建立关联关系; 观察器初始化时,自动绑定注册到“被观察者”

       2,当“被观察者”发生变化时, 通知到“观察器”。

       3,“观察器”做出相应状态修改。

 

二,单例模式:

 

 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。

   1、单例类只能有一个实例。  一个进程内只有一个该类的对象。

   2、单例类必须自己创建自己的唯一实例。不能通过其他方法得到对象,比如反射。

 

1,适合场景:

   有些业务系统逻辑要求必须只有一个对象,Web 中的配置对象、数据库的连接池等。

  代码实现:

// 饿汉式,类加载后,立即生成单例对象。
//原理说明:利用类的静态变量只属于类,且只有一份的特性。因此也不能通过New新对象。
public
class Singleton { private static Singleton instance = new Singleton(); //包含一个自身对象的类变量 private Singleton (){}
public static Singleton getInstance() { //获取单例的唯一方法,无论你调用多少次方法,都是同一个对象。   return instance; } }

 

2,过程说明:

  1,加载类文件Singleton过程中,为 instance 静态变量分配空间,并初始化。

       2,构造方法 和静态变量均为private ,外界自能通过 getInstance方法获取对象。

 

三、 工厂模式

 .  .  .

posted @ 2022-06-29 19:31  gaussen126  阅读(56)  评论(0编辑  收藏  举报