职责链模式之真假美猴王

孙悟空最终还是没有能逃脱如来的手掌心,因缘注定,皈依佛门,虽没有了做齐天大圣是的逍遥快活,也没有大闹天宫时的轰轰烈烈,但是现在有了更重要的一项任务,那就是普度众生,《 西游记》第五十七回,说是“六耳猕猴”化作孙悟空的摸样,伤了唐僧,后又和孙悟空大打出手。。。这位假孙悟空,实力不用多说了吧,和真孙悟空一般无二,大战孙悟空,闹到上天入地下海。在唐僧那:念紧箍咒,两个都喊疼,自然看不出哪个真假;到天宫:拖塔天王拿照妖镜照,也看不出;又到观音那:观音也看不出;最后到幽冥处阎罗那:经“谛听”听过之后,“谛听”却说:“我看出来了,却不敢说”,最后还是如来老佛爷道出六耳真身并用金钵盂罩住,才被孙悟空一棍子打死。这是整个故事,看似很简单,很完整,不过,我发现一个天大的伏笔。

那就是,真假美猴王的故事和我们设计模式中的职责链模式有着异曲同工之妙,在面向对象程式设计里, 职责链模式是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。该模式还描述了往该处理链的末尾添加新的处理对象的方法。官方定义---使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理她为止。来看一下职责链模式的结构图:

在我们的实际生活中,我们也时常与职责链模式打着交道,比如类似“斗地主”这样的游戏中,小北出牌给他的下家,下家看看手中的牌,如果要不起上家的牌则将出牌请求再转发给他的下家,其下家再进行判断。一个循环下来,如果其他人都要不起该牌,则小北可以打出新的牌。在这个过程中,牌作为一个请求沿着一条链在传递,每一位纸牌的玩家都可以处理该请求。以我们上述真假美猴王的故事为例,看看我们的代码实现:

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            {
                TangSeng = new TangSeng("唐僧");
                LiTianWang = new LiTianWang("李天王");
                GuangYin = new GuangYin("观音菩萨");
                DiTing = new DiTing("谛听");
                RuLai = new RuLai("如来");
              }

            //唐僧-->托塔李天王-->观音菩萨-->阎罗殿谛听-->如来佛祖
            judgement.TangSeng.NextImmortal = judgement.LiTianWang;
            judgement.LiTianWang.NextImmortal = judgement.GuanYin;
            judgement.TangSeng.NextImmortal = judgement.DiTing;
            judgement.DiTing.NextImmortal = judgement.RuLai;

            //两美猴王入场
            string SunWuKong = "SunWuKong",
            SixEarMonkey = "SixEarMonkey";
            //开始判断真假美猴王
            TheRealMonkeyKing RealMonkeyKing = judgement.Judge(SunWuKong, SixEarMonkey);
            Console.WriteLine();
            Console.WriteLine("Then,真正的美猴王是:" + RealMonkeyKing + "孙悟空");

            Console.ReadKey();
        }
    }

    //管理者,也就是众多神仙们
    abstract class Immortal
    {
        protected string name;
        //神仙的上级,这里的级别并没有严格的等级制度之分,只是因为该级别身份的神仙没有辨别出真假孙悟空
        protected Immortal superior;
        public Immortal (string name )
        {
            this.name = name;
        }
        //设置神仙的上级,这里的级别并没有严格的等级制度之分,只是因为该级别身份的神仙没有辨别出真假孙悟空
        public void SetSuperior(Immortal superior)
        {
            this.superior = superior;
        }

        //申请请求
        abstract public void RequestApplication(Request request);

    }
    //接下来,具体的神仙判断,首先是唐僧
    //唐僧
    public class TangSeng : Immortal
    {

        /// 唐僧判断真假美猴王

        public TheRealMonkeyKing Handler(string SunWukong, string SixEarMonkey)
        {
            Console.WriteLine(" 唐僧念《紧箍儿咒》,二人一齐叫苦, 唐僧也不认得真假,两悟空打到李天王哪里");
            return NextImmortal.Immortal(SunWukong, SixEarMonkey);
        }

        // 指定下一路神仙  来判断真假美猴王
        public Immortal  NextImmortal { get; set; }

    }

    //托塔李天王
    public class LiTianWang : Immortal
    {

        //李天王判断真假美猴王

        public TheRealMonkeyKing Immortal(string SunWukong, string SixEarMonkey)
        {
            Console.WriteLine(" 李天王取照妖镜照住,镜中乃是两个孙悟空,毫发不差。玉帝亦辨不出,两悟空大战几百回合,来到了观音那里");
            return NextImmortal.Immortal(SunWukong, SixEarMonkey);
        }

        // 指定下一路神仙  来判断真假美猴王
        public Immortal NextImmortal { get; set; }

    }

    //观音
    public class Guanyin : Immortal
    {

        //观音判断真假美猴王

        public TheRealMonkeyKing Immortal(string SunWukong, string SixEarMonkey)
        {
            Console.WriteLine(" 观音念《紧箍儿咒》,二人一齐叫苦, 唐僧也不认得真假,两悟空打到阎罗殿,谛听出来辨别");
            return NextImmortal.Immortal(SunWukong, SixEarMonkey);
        }

        // 指定下一路神仙来判断真假美猴王

        public Immortal  NextImmotal { get; set; }

    }

    //谛听
    public class DiTing :Immortal
    {

        // 谛听判断真假美猴王

        public TheRealMonkeyKing Immortal(string SunWukong, string SixEarMonkey)
        {
            Console.WriteLine("阎罗殿的谛听可以分辨的出真假, 却不敢说出来,因为六耳猕猴的后台很强:如来是也");
            return NextImmortal.Immortal(SunWukong, SixEarMonkey);
        }

        // 指定下一路神仙  来判断真假美猴王

        public IHandler NextHandler { get; set; }
    }

    //如来
     public class RuLai :Immortal
    {

        // 如来判断真假美猴王

        public TheRealMonkeyKing Immortal(string SunWukong, string SixEarMonkey)
        {
            Console.WriteLine(" 如来佛辨出真假,是所有神仙都没有听说过的新物种:六耳猕猴");

            return TheRealMonkeyKing.SunWukong;

        }
}
</span></span></span>

对于真假美猴王这块的内容,大家争论不一,在真假美猴王事出之前,孙悟空并不完全都听唐僧的话,甚至有时候,还闹个小矛盾,导致唐僧只好念紧箍咒,典型的一个叛逆者形象。可自从真假美猴王事出之后,孙悟空从此保护唐僧安安分分。而以此事可以看出,孙悟空前后可判若两人。不排除,孙悟空已被如来利用六耳猕猴一战中,安安静静、无人知晓的收服了。也有人说佛祖能通晓过去未来,早就设此考验,算到六耳猕猴必死于孙悟空手上,届时孙悟空就能战胜心魔,真正走上成仙之路。如果佛祖出手阻挡孙悟空的那一棍,保住六耳猕猴性命,那么设此考验又有何意义?这也说明了,孙悟空杀死六耳猕猴,彻底清除了自己内心的邪恶一面,从内心上懂得了成仙成佛的真正的道路。所以在“真假美猴王”一难之后才会服服帖帖,真心为皈依佛门而保护唐僧。

西游记的故事还在演绎流传,设计模式的精彩稍后继续......

职责链模式之真假美猴王

时间: 2024-09-30 08:00:03

职责链模式之真假美猴王的相关文章

[设计模式]&lt;6&gt;. C++与职责链模式(chain of rsponsibility pattern)

默默地EEer,原文地址: http://www.cnblogs.com/hebaichuanyeah/p/5625233.html 职责链模式指使多个对象多有机会处理请求,避免请求发送者和接受者的耦合关系. 将这些接受处理的对象连成一条链,并沿着该链处理请求. 一个传说中的应用情景: 假如去政府部门办事,遇到了打字员小丽,在打LOL的小张以及主任老李,互相踢皮球推脱. #include <iostream> using namespace std; class Handler { prote

职责链模式

1.职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,指导有一个对象处理它为止. 2.优点:(1).当客户提交一个申请时,请求是沿链传递直至有一个对象负责处理它位置.在客户端根本不需要知道是谁做的处理.(2).简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用.(3).可以随时增加或者修改处理一个请求的结构.增强了给对象纸牌职责的灵活性. 3.注意:一个请求极有可能到链的末端都

设计模式之行为型模式—— 3.5 职责链模式

<?php /**  * 3.5 职责链模式  *  定义:  *  使多个对象都有机会处理请求,从而避免请求的  *  发送者和接受者直接的耦合关系.将这个对象连  *  成一条链,并沿着这条链传递该请求,直到有一  *  个对象处理它为止.  *  角色:  *  1. 抽象Handler类  *  职责:定义一个处理请示的接口.  *  2. 具体Handler类  *  职责:具体处理者类,处理它所负责的请求  *    ,它可访问它的后继者,如果可处理  *    该请求,就处理之,否

大话设计模式C++实现-第24章-职责链模式

一.UML图 二.概念 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合.将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止. 三.说明  角色: (1)Handler类:定义一个处理请求的接口. (2)ConcreteHandler类:具体的处理请求的接口. 职责链模式的好处: (1)最关键的是,当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它. (2)

职责链模式——机房收费系统下机结账

在机房收费系统中,学生下机结账最让人头疼了.因为学生的消费时间(下机时间-上机时间-上机准备时间)有三种情况: 1.消费时间<=0,也就是下机时间与上机时间的间隔在上机准备时间范围内,这种情况是不收费的. 2.消费时间<=最少上机时间,这种情况下消费时间按照最少上机时间收费. 3.消费时间>最少上机时间,这种情况还要考虑递增单位时间.比如递增单位时间是10分钟,消费时间是42分 钟,42/10=4.....2,这种情况要按照50分钟收费. 以上消费时间就分了三种情况,更复杂的是第二种和第

职责链模式Chain of Responsibility

1.简介 1)模式概述:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它位置. 2)核心: 2.UML与代码实现 1)结构:UML 模式组成: 抽象处理者角色(Handler:Approver):定义一个处理请求的接口,和一个后继连接(可选) 具体处理者角色(ConcreteHandler:President):处理它所负责的请求,可以访问后继者,如果可以处理请求则处理,否则将该请求转给他的后继者. 客户类

VB.NET &amp; 职责链模式

前几天一直在讲设计模式,在和师哥师姐的讨论过程中,发现能在机房收费个人重构版中用到好几个设计模式,首先来讨论讨论职责链模式: 首先当看见这个模式的第一眼就觉得这是一个很简单的模式,可是当使用起来真的得考虑许多,首先要明白什么是链?链是一系列节点的集合,可以灵活拆分再重组.这也是与 链表不同的地方,用户可以去访问节点中的任何一点作为开始节点. 定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 举

学习日记之职责链模式和Effective C++

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着该条链传递该请求,直到有一个对象处理它为止. (1),当客户提交一个请求时,请求时沿着链传递直到有一个 ConcreteHandler 对象负责处理它. (2),接收者和发送者都没有对方的明确信息,切链中的对象自己也不知道链的结构.结果是职责链可简化为对象之间的连接,它们仅需保留一个指向其后继者的引用.而不惜保留它所有的候选接收者的引用

(20):(行为型模式) Chain Of Responsibility 职责链模式

(20):(行为型模式) Chain Of Responsibility 职责链模式,布布扣,bubuko.com