设计模式二

接设计模式一

当然这个receiver类是需要外界去调用,我们就需要一个执行类command,这个是具体执行类,在这个里面我们需要管理receiver,外界通过这个去调用receiver,这个command类就相当于经纪人。最后一个类就是invoker,这个类是一个中心,因为我们的需求是多变的,所以我们的receiver与command将会非常多的,那么我们就将设置一个中心管理类来一起去管理他们,这个类就是invoker,他负责我们去执行什么命令,去调用什么方法。

网上的这句话非常好,一起开看看。命令模式的本质就是对命令进行分装,将发送命令与执行命令的责任分开。每一个命令都是要给操:请求的一个发送请求,要执行要给操作;接受的一方都到请求操作。请求方和接收方独立开来,使得请求的一方不必知道接收请求一个的接口,更不必知道请求是怎么被接收的。以及操作是否被执行,何时被执行,以及是怎么被执行的。这里我们要知道,在软件工程中一个非常重要的思想就是分装的思想,将方法就行封装,外界不必知道它的构成,外界就是一个调用者,他只需要值发送命令就好了,这样功能就比较单一,这个就符合单一职责原则,代码耦合性性就大大降低。

命令模式使请求本身成为一个对象,这个对象和其他对象一个可以被存储和传递。命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。

命令模式的优点:解除了请求者与实现者之间的耦合,降低了系统的耦合度。对请求排队或记录请求日志,支持撤销操作。可以容易的设计一个组合命令。新命令可以容易的加入到系统中。总之一句话就是一些都是为了高内聚,低耦合。我们在学设计模式的时候,我们没有必要一定去纠结这个模式和那个模式

 

 

十二 责任链模式

这个模式我们还是比较熟悉的,因为在以前的狼人杀课程中我们是已经学过的。责任链模式是对象的行为模式。使多个对象都有机会处理请求,从而避免请求的发送者和接收者直接的耦合关系。将这些对象练成一条链,沿着这天链传递请求,直到有一个对象处理它为止。责任链模式强调额是每一个对象其对下家的引用来组成一条链,利用这种方式将发送者和接受者解耦

 

/// <summary>
    /// 抽象处理角色
    /// </summary>
    public abstract class Handler
    {
        protected Handler successor;
        public abstract void HandlerRequest(string condition);
        public Handler getSuccessor()
        {
            return successor;
        }
        public void SetSuccessor(Handler successor)
        {
            this.successor = successor;
        }
    }

    #region 链表子类
    public class ConcreteHandler1 : Handler
    {

        public override void HandlerRequest(string condition)
        {
            //如果是自己的责任,就自己处理;如果不是自己的责任,就负责传给下家处理
            if (condition.Equals("ConcreteHandler1"))
            {
                Console.WriteLine("ConcreteHandler1 handled");
                return;
            }
            else
            {
                Console.WriteLine("ConcreteHandler1 passed");
                getSuccessor().HandlerRequest(condition);
            }
        }
    }

    public class ConcreteHandler2 : Handler
    {

        public override void HandlerRequest(string condition)
        {
            //如果是自己的责任,就自己处理;如果不是自己的责任,就负责传给下家处理
            if (condition.Equals("ConcreteHandler2"))
            {
                Console.WriteLine("ConcreteHandler2 handled");
                return;
            }
            else
            {
                Console.WriteLine("ConcreteHandler2 passed");
                getSuccessor().HandlerRequest(condition);
            }
        }
    }
    #endregion

    public class ConcreteHandlerN : Handler
    {

        public override void HandlerRequest(string condition)
        {
            Console.WriteLine("ConcreateHandlerN handled");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Handler handler1 = new ConcreteHandler1();
            Handler handler2 = new ConcreteHandler2();
            Handler handlern = new ConcreteHandlerN();

            //链起来
            handler1.SetSuccessor(handler2);
            handler2.SetSuccessor(handlern);

            //假设这个请求时ConcreteHandler2的责任
            handler1.HandlerRequest("ConcreteHandler2");
            Console.ReadKey();
        }
    }

  这种模式首先我们应该创建一个抽象基类,因为这个模式首先是一个链条,这就说明了一点,链条上的所有都是具有不同需求但是基本结构都一样的类,他们应该是继承同一个父亲。在这个基类中我们写出所有的方法,让子类去实现。子类去实现方法HandlerRequest(),这个方法就是链接的关键,其实本质就是在方法中调用另一个类,如果不满足就是调用下一个。用一个更形象一点的说法就是。我们在每一个类中都声明一个空结点变量,handler1.SetSuccessor(handler2);handler2.SetSuccessor(handlern);就像上面的一样,对类中的节点变量进行赋值,我们在 类中使用这个getSuccessor().HandlerRequest(condition);就相当于在自身类中去调用得到结点的方法,多个结点相互调用,这样就像一个链条一样,而其中传递的就是变量,变量在每一个结点类的方法中进行运算如果满足就终止;如果不满足就接着下一个。

十三  观察者模式

观察者模式最重要的就是订阅机制。观察者是订阅者,我只要发出新的消息,然后这个消息就会自动去通知所有的订阅者。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 设计模式_观察者模式
{

    public delegate void DeloB(Subject subject, EventArgs e);

    //被观察者抽象类
    public abstract class Subject
    {
        private string _strIntelligence;
        private string _name;
        public string StrIntelligence { get { return _strIntelligence; } set { _strIntelligence = value; } }
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        public Subject(string name, string strIntelligence)
        {
            Name = name;
            StrIntelligence = strIntelligence;
        }

        public event DeloB DelPUBGOB;//当OB队友报出敌情时候的事件


        public void PUBGSay()
        {
            DelPUBGOB(this, new EventArgs());
        }
    }

    //观察者抽象类
    public abstract class OBServer
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        abstract protected void Notfied(Subject subject, EventArgs e);
        public OBServer(Subject subject, string name)
        {
            Name = name;
            subject.DelPUBGOB += this.Notfied;
        }
    }

    //活着的队友
    public class TeammateAlive : OBServer
    {
        public TeammateAlive(Subject subject, string name)
            : base(subject, name)
        { }


        protected override void Notfied(Subject subject, EventArgs e)
        {
            Console.WriteLine("{0}:收到", this.Name);
        }
    }

    //死亡的队友
    public class DieTeammates : Subject
    {
        public DieTeammates(string name, string strIntelligence)
            : base(name, strIntelligence)
        {
            Console.WriteLine("{0}:{1}", this.Name, this.StrIntelligence);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            DieTeammates die = new DieTeammates("JackCC", "北偏东75d度发现4个敌人有点慌");
            TeammateAlive team1 = new TeammateAlive(die, "JackDD");
            TeammateAlive team2 = new TeammateAlive(die, "JackFF");
            TeammateAlive team3 = new TeammateAlive(die, "JackGG");
            die.PUBGSay();
            Console.ReadKey();
        }
    }
}

 

posted @ 2019-07-15 15:46  jake_caiee  阅读(141)  评论(0编辑  收藏  举报