常见设计模式说明和代码实践
一,观察者模式:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,要考虑到易用和低耦合,保证高度的协作。
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方法获取对象。
三、 工厂模式
. . .