两种语言实现设计模式(C++和Java)(十七:观察者模式)

观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。

观察者模式是一种对象行为型模式,其主要优点如下。

  1. 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。
  2. 目标与观察者之间建立了一套触发机制。

它的主要缺点如下。

  1. 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
  2. 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。

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 }

 

转载于:https://www.cnblogs.com/Asp1rant/p/11342419.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值