首页 > 其他分享 >14_访问者模式

14_访问者模式

时间:2024-03-12 10:56:58浏览次数:27  
标签:Feed 14 对象 void 模式 animal public 访问者

访问者模式是一种行为型设计模式,它允许在不改变被访问对象结构的前提下,定义对这些对象的新操作。访问者模式将操作和对象结构分离,使得可以在不修改对象结构的情况下添加新的操作。

访问者模式有四个主要角色:

  1. 抽象访问者(Visitor):定义了访问者可以访问的对象的接口,包含了一系列的访问方法,每个方法对应一种对象的访问操作。

  2. 具体访问者(Concrete Visitor):实现了抽象访问者接口,对具体的对象结构进行访问操作。

  3. 抽象元素(Element):定义了对象结构的公共接口,包含了一个接受访问者的方法。

  4. 具体元素(Concrete Element):实现了抽象元素接口,提供了具体的对象结构。

访问者模式的工作原理如下:

  1. 抽象访问者定义了一系列的访问方法,每个方法对应一种对象的访问操作。

  2. 具体访问者实现了抽象访问者接口,并实现了对具体对象的访问操作。

  3. 抽象元素定义了对象结构的公共接口,并包含了一个接受访问者的方法。

  4. 具体元素实现了抽象元素接口,提供了具体的对象结构,并实现了接受访问者的方法。

  5. 客户端通过调用访问者的方法,对对象进行访问操作。

访问者模式的优点包括:

  1. 可以对对象结构进行新的操作,而无需修改对象结构本身。

  2. 可以将相关操作封装到一个访问者中,提高了代码的可维护性和扩展性。

  3. 可以将对象结构和操作进行解耦,使得代码更加清晰。

访问者模式适用于以下场景:

  1. 当需要对一个复杂对象结构进行一系列不相关或独立的操作时,可以使用访问者模式。

  2. 当对象结构的类层次比较稳定,但经常需要定义新的操作时,可以使用访问者模式。

总结而言,访问者模式通过将操作和对象结构分离,可以在不修改对象结构的情况下定义新的操作。它提供了一种灵活的方式来对复杂对象结构进行访问和操作,并提高了代码的可维护性和扩展性。

 

案例:

我们就以养宠物为例,宠物分别有狗和猫,要给宠物喂食的话,主人可以喂,其他人也可以喂食。
访问者角色:给宠物喂食的人
具体访问者角色:主人、其他人
抽象元素角色:动物抽象类
具体元素角色:宠物狗、宠物猫
结构对象角色:主人家

 

Visitor

 public interface IPerson
    {
        //优点 定义对象结构的通用功能
        void Feed(Cat animal);// 给谁投喂?
        void Feed(Dog animal);// 给谁投喂?
        void Feed(Fish animal);// 给谁投喂?

        //缺点:一是依赖了具体类 ,违反了依赖倒置原则; 二是每增加一个元素(宠物),这里就要增加一个方法,违反了开闭原则
    }

 

Element

public interface IAnimal
    {
        void Accept(IPerson person);
    }

 

Concrete Element

public class Cat : IAnimal
    {
        public void Accept(IPerson person)
        {
            person.Feed(this);

            Console.WriteLine("好吃,喵喵喵");
        }
    }
public class Dog : IAnimal
    {
        public void Accept(IPerson person)
        {
            person.Feed(this);

            Console.WriteLine("我吃饱了,汪汪汪...");
        }
    }
public class Fish : IAnimal
    {
        public void Accept(IPerson person)
        {
            person.Feed(this);
            Console.WriteLine("咕噜噜.....");

        }
    }

 

Concrete Visitor

public class Master : IPerson
    {

        public void Feed(Cat animal)
        {
            Console.WriteLine("主人自已喂猫");
        }

        public void Feed(Dog animal)
        {
            Console.WriteLine("主人自已喂狗");
        }

        public void Feed(Fish animal)
        {
            Console.WriteLine("主人自已喂鱼");
        }
    }
public class Friend : IPerson
    {
        public void Feed(Cat animal)
        {
            Console.WriteLine("好朋友帮主人喂猫");
        }

        public void Feed(Dog animal)
        {
            Console.WriteLine("好朋友帮主人喂狗");
        }

        public void Feed(Fish animal)
        {
            Console.WriteLine("好朋友帮主人喂鱼");
        }
    }

 

Object Structure

/// <summary>
    /// 结构对象角色
    /// </summary>
    public class Home
    {
        private readonly List<IAnimal> animals = new List<IAnimal>();

        public void  Add(IAnimal animal)
        {
            animals.Add(animal);
        }

        public void Start(IPerson person)
        {
            foreach (var animal in animals)
            {
                animal.Accept(person);
            }
        }
    }

 

调用

internal class Client
    {
        public void Start()
        {
            Home home = new Home(); 
            home.Add(new Dog());
            home.Add(new Cat());

            Master master=new Master();
            home.Start(master);

            home.Add(new Fish());
            Friend friend=new Friend();
            home.Start(friend);

        }

    }
static void Main(string[] args)
        {
            new Client().Start();

            Console.ReadKey();
        }

 

标签:Feed,14,对象,void,模式,animal,public,访问者
From: https://www.cnblogs.com/MingQiu/p/18067817

相关文章

  • 13_代理模式
    代理模式是一种结构型设计模式,它提供了一个代理对象来控制对其他对象的访问。代理对象可以作为目标对象的代表,以控制对目标对象的访问、限制或增加功能。代理模式有三个主要角色:抽象主题(Subject):定义了目标对象和代理对象的公共接口,可以是抽象类或接口。真实主题(RealSubjec......
  • 12_享元模式
    享元模式是一种结构型设计模式,它通过共享细粒度的对象来最大限度地减少内存使用和对象创建的数量。享元模式通过将共享对象的状态外部化,使得对象可以共享,并提供了一个工厂类来管理共享对象的创建和获取。享元模式有五个主要角色:享元接口(Flyweight):定义了共享对象的接口,包含了需......
  • 11_外观模式
    外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式通过将客户端与子系统之间的复杂依赖关系解耦,简化了客户端的使用。外观模式有三个主要角色:外观(Facade):提供了一个统一的接口,用于访问子系统中的一组接口。外观封装了子系统的复杂性,简......
  • Redis安装之集群-哨兵模式(sentinel)模式
    官网说明:https://redis.io/docs/management/sentinel/一、背景Redis主从复制模型在一定程度上解决了读写分离、容灾恢复、数据备份、水平扩容支撑高并发的问题,但仍存在单点故障问题,即Mater宕机后,集群将无法提供写服务。二、方案原理主从复制的问题在于Mater宕机后,Slave......
  • 聊聊CWE 4.14 与 ISA/IEC 62443中,如何保障工业软件的安全性
    本文分享自华为云社区《CWE4.14与ISA/IEC62443》,作者:Uncle_Tom。1.序言随着5G的应用,物联的网发展,越来越多的自动化控制系统、云服务在工业控制系统被广泛使用。为了实现生产自动化,很多企业都引入了由PLC(可编程逻辑控制器)控制的自动化生产设备和相关的自动化生产系统。用......
  • 保护模式
    一、理解保护模式  大多数现代操作系统(包括Windows9X/NT/XP和Linux等)都是多任务的,CPU的保护模式是操作系统实现多任务的基础。了解保护模式的底层原理对学习操作系统有着事半功倍的作用。  保护模式是为了实现多任务而设计的,其名称中的“保护”就是保护任务环境中各个人物......
  • 观察者模式
     观察者:publicinterfaceObserver{voidupdate(floattemperature,floathumidity,floatpressure);}主体;publicinterfaceSubject{publicvoidregisterObserver(Observerobserver);publicvoidremoveObserver(Observerobserver);......
  • 第142篇:原生js实现响应式原理
    好家伙,狠狠地补一下代码量 本篇我们来尝试使用原生js实现vue的响应式使用原生js,即代表没有v-bind,v-on,也没有v-model,所有语法糖我们都用原生实现 1.给输入框绑个变量<body><inputid="input_1"></input></body><script>letdatavalue="66666"const......
  • C语言判断表达式的写法3<keyDown && keyDown<14
    if(3<keyDown&&keyDown<14){//Yourcodehere}可以写成if(3<keyDown<14){//Yourcodehere}吗答案:不能,因为在C语言中,if(3<keyDown&&keyDown<14) 和 if(3<keyDown<14) 是不同的。在C语言中,3<keyDown......
  • error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft
       Defaultingtouserinstallationbecausenormalsite-packagesisnotwriteableCollectingPyQt5-sipUsingcachedPyQt5_sip-12.13.0.tar.gz(123kB)Installingbuilddependencies...doneGettingrequirementstobuildwheel...donePreparing......