当前位置:编程学习 > VB >>

最近在学习设计模式,顺便写了下自己的理解。。

概述:
     辛辛苦苦了工作了一年,终于可以加薪了,向主管提交了加薪申请,主管一看不得了,自己职权不够,批不了,主管把申请上交总监,总监发现自己也批不了,申请到了总经理手中,总经理一看,小伙子口气不小了,有胆识敢申请,先来谈下心。预知后事如何,请看下回分解。
     这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

类图与实例:
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
样例:
C/C++ code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
#include <string>
using namespace std;
 
// 请求
class Request
{
public:
    int m_nNumber;
};
 
// 管理者
class Manager
{
public:
    Manager(string temp) { name = temp; }
    void SetSuccessor(Manager* temp) { manager = temp; }
    virtual void GetRequest(Request* request) = 0;
protected:
    Manager* manager;
    string name;
};
 
// 经理
class CommonManager : public Manager
{
public:
    CommonManager(string strTemp) : Manager(strTemp) {}
    virtual void GetRequest(Request* request);
};
 
void CommonManager::GetRequest(Request* request)
{
    if (request->m_nNumber>=0 && request->m_nNumber<1000)
    {
        cout << name << " 处理了请求: " << request->m_nNumber << endl;
    }
    else
    {
        manager->GetRequest(request);
    }
}
 
// 总监
class Majordomo : public Manager
{
public:
    Majordomo(string strTemp) : Manager(strTemp) {}
    virtual void GetRequest(Request* request);
};
 
void Majordomo::GetRequest(Request* request)
{
    if (request->m_nNumber <= 5000)
    {
        cout << name << " 处理了请求: " << request->m_nNumber << endl;
    }else
    {
        manager->GetRequest(request);
    }
}
 
//总经理  
class GeneralManager: public Manager  
{  
public:  
    GeneralManager(string name):Manager(name) {}  
    virtual void GetRequest(Request* request)  //总经理可以处理所有请求  
    {         
        cout << name << " 处理了请求: " << request->m_nNumber << endl;        
    }  
};
 
int main(){
 
    Manager* common = new CommonManager("张经理");
    Manager* major = new Majordomo("李总监");
    GeneralManager* general  = new GeneralManager("赵总");
    common->SetSuccessor(major);
    major->SetSuccessor(general);
    Request* rq = new Request();
 
    rq->m_nNumber = 999;
    common->GetRequest(rq);
     
    rq->m_nNumber = 4999;
    common->GetRequest(rq);
 
    rq->m_nNumber = 6999;
    common->GetRequest(rq);
 
    delete rq;
    delete major;
    delete common;
    delete general;
    return 0;
}


要点与实现:
1.要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当.
2.责任链模式并不创建责任链。责任链的创建必须由系统的其它部分创建出来。
3.责任链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。一个链可以是一条线,一个树,也可以是一个环。如下图所示,责任链是一个树结构的一部分。


看到这里的各位加薪申请都是general批...    :-))

我的博客里有其他已分享的理解:
我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
我所理解的设计模式(C++实现)——代理模式(Proxy Pattern)
我所理解的设计模式(C++实现)——享元模式(Flyweight Pattern)
我所理解的设计模式(C++实现)——外观模式(Facade Pattern)
我所理解的设计模式(C++实现)——装饰者模式(Decorator Pattern)
我所理解的设计模式(C++实现)——组合模式(Composite Pattern)
我所理解的设计模式(C++实现)——适配器模式(Adapter Pattern)
我所理解的设计模式(C++实现)——原型模式(Prototype Pattern)
我所理解的设计模式(C++实现)——建造者模式(Builder Pattern)
我所理解的设计模式(C++实现)——抽象工厂模式(Abstract Factory Pattern)
我所理解的设计模式(C++实现)——工厂方法模式(Factory Method Pattern)
我所理解的设计模式(C++实现)——简单工厂模式(Simple Factory Pattern)
我所理解的设计模式(C++实现)——桥模式(Bridge Pattern)
我所理解的设计模式(C++实现)——单例模式(Singleton Pattern) --------------------编程问答-------------------- 这个看起来和windows的消息传递机制很想像

发出一个消息(eg 用户按键),送人消息队列,消息循环提取消息,发给指定窗口,指定窗口进行处理,或者转换为别的消息,送给别的地方,如果消息不需要处理,送到缺省函数处理。 --------------------编程问答-------------------- 话说,LZ发错板块了 --------------------编程问答-------------------- 楼主很特别,我想把他这帖移动到C/C++版和VC版时,系统都说移动失败,说他在该版被限制发帖,是不是平时灌水太多啊
补充:VB ,  API
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,