两种语言实现设计模式(C++和Java)(十七:观察者模式)
观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
观察者模式是一种对象行为型模式,其主要优点如下。
- 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。
- 目标与观察者之间建立了一套触发机制。
它的主要缺点如下。
- 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
- 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。
UML:
示例:
当“人民币汇率”升值时,进口公司的进口产品成本降低且利润率提升,出口公司的出口产品收入降低且利润率降低;当“人民币汇率”贬值时,进口公司的进口产品成本提升且利润率降低,出口公司的出口产品收入提升且利润率提升。
C++实现:
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 class Company{ 7 public: 8 virtual void response(int number)=0; 9 }; 10 11 class Rate{ 12 protected: 13 vector<Company*> companies; 14 public: 15 void add(Company* pCompany){ 16 companies.push_back(pCompany); 17 } 18 19 void remove(){ 20 companies.pop_back(); 21 } 22 23 virtual void change(int number)=0; 24 }; 25 26 class RMBrate:public Rate{ 27 public: 28 void change(int number){ 29 for(Company* company:companies){ 30 company->response(number); 31 } 32 } 33 }; 34 35 class ImportCompany:public Company{ 36 public: 37 virtual void response(int number){ 38 if (number > 0){ 39 cout << "RMB rate improved by " << number << "%, the cost of import product reduced and benefit rate of the company improved." << endl; 40 } else if (number < 0){ 41 cout << "RMB rate decreased by " << number << "%, the cost of import product improved and benefit rate of the company decreased." << endl; 42 } 43 } 44 }; 45 46 class ExportCompany:public Company{ 47 public: 48 virtual void response(int number){ 49 if (number > 0){ 50 cout << "RMB rate improved by " << number << "%, the cost of export product reduced and benefit rate of the company reduced." << endl; 51 } else if (number < 0){ 52 cout << "RMB rate decreased by " << number << "%, the cost of export product improved and benefit rate of the company improved." << endl; 53 } 54 } 55 }; 56 57 int main() 58 { 59 Rate* rate = new RMBrate(); 60 Company* company1 = new ImportCompany(); 61 Company* company2 = new ExportCompany(); 62 rate->add(company1); 63 rate->add(company2); 64 rate->change(5); 65 rate->change(-6); 66 return 0; 67 }
Java实现:
1 import java.util.*; 2 public class RMBrateTest 3 { 4 public static void main(String[] args) 5 { 6 Rate rate=new RMBrate(); 7 Company watcher1=new ImportCompany(); 8 Company watcher2=new ExportCompany(); 9 rate.add(watcher1); 10 rate.add(watcher2); 11 rate.change(10); 12 rate.change(-9); 13 } 14 } 15 //抽象目标:汇率 16 abstract class Rate 17 { 18 protected List<Company> companys=new ArrayList<Company>(); 19 //增加观察者方法 20 public void add(Company company) 21 { 22 companys.add(company); 23 } 24 //删除观察者方法 25 public void remove(Company company) 26 { 27 companys.remove(company); 28 } 29 public abstract void change(int number); 30 } 31 //具体目标:人民币汇率 32 class RMBrate extends Rate 33 { 34 public void change(int number) 35 { 36 for(Company obs:companys) 37 { 38 ((Company)obs).response(number); 39 } 40 } 41 42 } 43 //抽象观察者:公司 44 interface Company 45 { 46 void response(int number); 47 } 48 //具体观察者1:进口公司 49 class ImportCompany implements Company 50 { 51 public void response(int number) 52 { 53 if(number>0) 54 { 55 System.out.println("人民币汇率升值"+number+"个基点,降低了进口产品成本,提升了进口公司利润率。"); 56 } 57 else if(number<0) 58 { 59 System.out.println("人民币汇率贬值"+(-number)+"个基点,提升了进口产品成本,降低了进口公司利润率。"); 60 } 61 } 62 } 63 //具体观察者2:出口公司 64 class ExportCompany implements Company 65 { 66 public void response(int number) 67 { 68 if(number>0) 69 { 70 System.out.println("人民币汇率升值"+number+"个基点,降低了出口产品收入,降低了出口公司的销售利润率。"); 71 } 72 else if(number<0) 73 { 74 System.out.println("人民币汇率贬值"+(-number)+"个基点,提升了出口产品收入,提升了出口公司的销售利润率。"); 75 } 76 } 77 }
分类:
设计模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具