迭代器模式与观察者模式
迭代器模式與觀察者模式
參考教程:https://www.bilibili.com/video/BV1G4411c7N4
代碼實現 Github:https://github.com/yaokuku123/pattern
迭代器模式
編寫程序展示一個學校院系結構:需求是這樣,要在一個頁面中展示出學校的院系組成,一個學校有多個學院,一個學院有多個系。如圖:
5-1592899506899.png- 分析
將學院看做是學校的子類,系是學院的子類,這樣實際上是站在組織大小來進行分層次的
實際上我們的要求是 :在一個頁面中展示出學校的院系組成,一個學校有多個學院,一個學院有多個系, 因此這種方案,不能很好實現遍歷的操作
解釋:如果我們的集合元素是用不同的方式實現的,有數組,還有java的集合類,或者還有其他方式,當客戶端要遍歷這些集合元素的時候就要使用多種遍歷方式,而且還會暴露元素的內部結構,可以考慮使用迭代器模式解決。迭代器模式提供一種遍歷集合元素的統一接口,用一致的方法遍歷集合元素, 不需要知道集合對象的底層表示,即:不暴露其內部的結構。
對原理類圖的說明-即(迭代器模式的角色及職責)
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) 測量數據更新時,要能實時的通知給第三方
- 分析
解釋:對象之間多對一依賴的一種設計方案,被依賴的對象為Subject, 依賴的對象為Observer,Subject通知Observer變化,Subject是1的一方。Observer是多的一方。
觀察者模式設計后,會以集合的方式來管理用戶(Observer),包括注冊,移除和通知。
這樣,我們增加觀察者(這里可以理解成一個新的公告板),就不需要去修改核心類WeatherData不會修改代碼,遵守了ocp原則。
總結
以上是生活随笔為你收集整理的迭代器模式与观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人设置微信公众号自定义菜单的初级经验
- 下一篇: 整天坐着有多危险