日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

迭代器模式与观察者模式

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 迭代器模式与观察者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

迭代器模式與觀察者模式

參考教程:https://www.bilibili.com/video/BV1G4411c7N4
代碼實現 Github:https://github.com/yaokuku123/pattern


迭代器模式

  • 案例
  • 編寫程序展示一個學校院系結構:需求是這樣,要在一個頁面中展示出學校的院系組成,一個學校有多個學院,一個學院有多個系。如圖:

    5-1592899506899.png
  • 傳統方法
  • 6-1592899533512.png
    • 分析
  • 將學院看做是學校的子類,系是學院的子類,這樣實際上是站在組織大小來進行分層次的

  • 實際上我們的要求是 :在一個頁面中展示出學校的院系組成,一個學校有多個學院,一個學院有多個系, 因此這種方案,不能很好實現遍歷的操作

  • 迭代器模式
  • 解釋:如果我們的集合元素是用不同的方式實現的,有數組,還有java的集合類,或者還有其他方式,當客戶端要遍歷這些集合元素的時候就要使用多種遍歷方式,而且還會暴露元素的內部結構,可以考慮使用迭代器模式解決。迭代器模式提供一種遍歷集合元素的統一接口,用一致的方法遍歷集合元素, 不需要知道集合對象的底層表示,即:不暴露其內部的結構。

  • 代碼實現
  • 7-1592899697426.png

    對原理類圖的說明-即(迭代器模式的角色及職責)

  • Iterator : 迭代器接口,是系統提供,含義 hasNext, next, remove

  • ConcreteIterator : 具體的迭代器類,管理迭代

  • Aggregate :一個統一的聚合接口, 將客戶端和具體聚合解耦

  • ConcreteAggreage : 具體的聚合持有對象集合, 并提供一個方法,返回一個迭代器,該迭代器可以正確遍歷集合

  • Client:客戶端通過Iterator和Aggregate依賴子類

  • [圖片上傳失敗...(image-c60506-1593227929478)]

    package com.yqj.pattern.iterator;import java.util.ArrayList; import java.util.Iterator; import java.util.List;class Department {private String name;private String desc;public Department(String name, String desc) {this.name = name;this.desc = desc;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;} }class ComputerCollegeIterator implements Iterator<Department> {private Department[] departments;int position = 0;public ComputerCollegeIterator(Department[] departments) {this.departments = departments;}@Overridepublic boolean hasNext() {if (position >= departments.length || departments[position] == null) {return false;}return true;}@Overridepublic Department next() {return departments[position++];} }class InfoCollegeIterator implements Iterator<Department> {private List<Department> departments;private int index = -1;public InfoCollegeIterator(List<Department> departments) {this.departments = departments;}@Overridepublic boolean hasNext() {if (index >= departments.size() - 1) {return false;} else {index++;return true;}}@Overridepublic Department next() {return departments.get(index);} }interface College {String getName();//增加系的方法void addDepartment(String name, String desc);//返回迭代器遍歷Iterator createIterator(); }class ComputerCollege implements College {private Department[] departments;//保存當前數組的對象個數private int numOfDepartment = 0;public ComputerCollege() {departments = new Department[5];addDepartment("Java","Java desc");addDepartment("C++","C++ desc");addDepartment("Python","Python desc");}@Overridepublic String getName() {return "計算機學院";}@Overridepublic void addDepartment(String name, String desc) {Department department = new Department(name, desc);departments[numOfDepartment++] = department;}@Overridepublic Iterator createIterator() {return new ComputerCollegeIterator(departments);} }class InfoCollege implements College{List<Department> departments;public InfoCollege() {departments = new ArrayList<>();addDepartment("信息安全","信息安全");addDepartment("網絡安全","網絡安全");addDepartment("服務器安全","服務器安全");}@Overridepublic String getName() {return "信息工程學院";}@Overridepublic void addDepartment(String name, String desc) {departments.add(new Department(name,desc));}@Overridepublic Iterator createIterator() {return new InfoCollegeIterator(departments);} }//遍歷類 class OutputImpl{private List<College> colleges;public OutputImpl(List<College> colleges) {this.colleges = colleges;}public void printCollege(){Iterator<College> iterator = colleges.iterator();while (iterator.hasNext()){College college = iterator.next();System.out.println("========="+college.getName()+"========");printDepartment(college.createIterator());}}public void printDepartment(Iterator<Department> iterator){while (iterator.hasNext()){Department department = iterator.next();System.out.println(department.getName());}} }public class Client {public static void main(String[] args) {List<College> colleges = new ArrayList<>();ComputerCollege computerCollege = new ComputerCollege();InfoCollege infoCollege = new InfoCollege();colleges.add(computerCollege);colleges.add(infoCollege);OutputImpl output = new OutputImpl(colleges);output.printCollege();} }
  • 小結
  • 優點

  • 提供一個統一的方法遍歷對象,客戶不用再考慮聚合的類型,使用一種方法就可以遍歷對象了。

  • 隱藏了聚合的內部結構,客戶端要遍歷聚合的時候只能取到迭代器,而不會知道聚合的具體組成。

  • 提供了一種設計思想,就是一個類應該只有一個引起變化的原因(叫做單一責任原則)。在聚合類中,我們把迭代器分開,就是要把管理對象集合和遍歷對象集合的責任分開,這樣一來集合改變的話,只影響到聚合對象。而如果遍歷方式改變的話,只影響到了迭代器。

  • 當要展示一組相似對象,或者遍歷一組相同對象時使用, 適合使用迭代器模式

  • 缺點

    每個聚合對象都要一個迭代器,會生成多個迭代器不好管理類

    觀察者模式

  • 案例
  • 天氣預報項目需求,具體要求如下: 1) 氣象站可以將每天測量到的溫度,濕度,氣壓等等以公告的形式發布出去(比如 發布到自己的網站或第三方)。 2) 需要設計開放型API,便于其他第三方也能接入氣象站獲取數據。 3) 提供溫度、氣壓和濕度的接口 4) 測量數據更新時,要能實時的通知給第三方

  • 傳統方案
  • 1-1592961163081.png
    • 分析
  • 無法在運行時動態的添加第三方 (新浪網站) 2) 違反ocp原則=>觀察者模式
  • 觀察者模式
  • 解釋:對象之間多對一依賴的一種設計方案,被依賴的對象為Subject, 依賴的對象為Observer,Subject通知Observer變化,Subject是1的一方。Observer是多的一方。

  • 代碼實現
  • 2-1592961436939.png package com.yqj.pattern.observer;import java.util.ArrayList; import java.util.List;interface Subject{void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObserver(); }class WeatherData implements Subject{private float temperature;private float pressure;private float humidity;private List<Observer> observers = new ArrayList<>();public float getTemperature() {return temperature;}public float getPressure() {return pressure;}public float getHumidity() {return humidity;}public void setData(float temperature,float pressure,float humidity){this.temperature = temperature;this.pressure = pressure;this.humidity = humidity;notifyObserver();}@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {if(observers.contains(observer)){observers.remove(observer);}}//遍歷所有觀察者并通知@Overridepublic void notifyObserver() {System.out.println("======update========");for (Observer observer : observers) {observer.update(temperature,pressure,humidity);}} }interface Observer{void update(float temperature,float pressure,float humidity); }class Baidu implements Observer{private float temperature;private float pressure;private float humidity;@Overridepublic void update(float temperature,float pressure,float humidity) {this.temperature = temperature;this.pressure = pressure;this.humidity = humidity;display();}public void display(){System.out.println("Baidu temperature:"+temperature);System.out.println("Baidu pressure:"+pressure);System.out.println("Baidu humidity"+humidity);} }class Sina implements Observer{private float temperature;private float pressure;private float humidity;@Overridepublic void update(float temperature,float pressure,float humidity) {this.temperature = temperature;this.pressure = pressure;this.humidity = humidity;display();}public void display(){System.out.println("Sina temperature:"+temperature);System.out.println("Sina pressure:"+pressure);System.out.println("Sina humidity"+humidity);} }public class Client {public static void main(String[] args) {WeatherData weatherData = new WeatherData();Observer baidu = new Baidu();Observer sina = new Sina();weatherData.registerObserver(baidu);weatherData.registerObserver(sina);weatherData.setData(35,150,20);weatherData.setData(33,111,25);} }
  • 小結
  • 觀察者模式設計后,會以集合的方式來管理用戶(Observer),包括注冊,移除和通知。

  • 這樣,我們增加觀察者(這里可以理解成一個新的公告板),就不需要去修改核心類WeatherData不會修改代碼,遵守了ocp原則。

  • 總結

    以上是生活随笔為你收集整理的迭代器模式与观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。