• 设计模式的C语言应用-访问者模式-第九章


    访问者模式(Visitor)介绍

    把对象数据和操作分离,使操作可以独立演化。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式是适用于那些数据结构比较稳定的模式。这个算是在C里面退化的不是那么厉害的一种模式思想, 或者说这种方法和C实现天然结合而不成为模式。因为C里面本来就很少将数据和访问方法封装在一起,数据的组织形式是数据结构的范畴,访问函数是代码流程设计的范畴。

    面向对象实现的访问者模式

    以下是用面向对象实现的访问者模式。两个帽子子类实例的不包含特有访问方法,也就是说,设计上只是想把这两个子类当作数据。帽子有两种访问方法price_show和size_show。

    这里变化的因素有两个,不同的帽子和不同的访问方法(price和size)。解决不同帽子的方法是增加不同的帽子具体类。解决不同的访问方法是不同的具体访问方法子类price_show和size_show。这就是所谓的把对象数据和操作分离。

    可以看出,虽然是对象数据和操作分离,但是数据的父类也必须提供了统一的访问接口,只不过不需要在子类里有特定的访问接口。

    如果增加别的访问方法,就继续增加访问抽象父类和子类,并且修改帽子的抽象父类。

    public abstract class Visitor { 
    
        public abstract void visitor(capA a); 
    
        public abstract void visitor(capB b); 
    
    } 
    
    public class price_show extends Visitor{ 
    
        public int visitor(capA a) { 
    
            return a.getPrice(); 
    
        } 
    
        public int visitor(capB b) { 
    
            return b.getPrice(); 
    
        }       
    
    } 
    
    public class size_show extends Visitor{ 
    
        public int visitor(capA a) { 
    
            return a.getsize(); 
    
        } 
    
        public int visitor(capB b) { 
    
            return b.getsize(); 
    
        }       
    
    }
    
    public abstract class cap {
    
        protected int size;
    
        protected int price;
    
        public cap (int size,int price){
    
            this.size = size;
    
            this.price = price;
    
        }
    
       
    
        public int getsize() {
    
            return this.size;
    
        }
    
        public int getPrice() {
    
            return this.price;
    
        }
    
       
    
        public abstract void accept(Visitor visitor);
    
    }
    
    public class capA extends cap{ 
    
        public capA(int size, int price) { 
    
            super(size, price); 
    
        } 
    
        public void accept(Visitor visitor) { 
    
            visitor.visitor(this); 
    
        } 
    
    }
    
    public class capB extends cap{ 
    
        public capB(int size, int price) { 
    
            super(size, price); 
    
        } 
    
        public void accept(Visitor visitor) { 
    
            visitor.visitor(this); 
    
        } 
    
    } 
    
    public class shop { 
    
        List<cap> list = new ArrayList<cap>(); 
    
         
    
        public void accept(Visitor visitor){ 
    
            Iterator<cap> iterator = list.iterator(); 
    
             
    
            while (iterator.hasNext()) { 
    
                iterator.next().accept(visitor); 
    
            } 
    
        } 
    
         
    
        public void addcap(cap cap){ 
    
            list.add(cap); 
    
        } 
    
         
    
        public void removecap(cap cap){ 
    
            list.remove(cap); 
    
        } 
    
    }
    
    public class Client { 
    
        public static void main(int[] args) { 
    
            cap a = new capA(38, 201); 
    
            cap b = new capB(41, 95); 
    
             
    
            shop shop = new shop(); 
    
            shop.addcap(a); 
    
            shop.addcap(b); 
    
             
    
            Visitor price_show = new price_show();           
    
            Visitor size_show = new size_show(); 
    
             
    
            shop.accept(price_show); 
    
            shop.accept(size_show); 
    
        } 
    
    }

    C实现的访问者模式

    struct cap
    
    {
    
        int size;
    
        int price;
    
    }
    
    struct cap shop[] =
    
    {
    
        [0] = {
    
            .size = 38,
    
            .price = 201
    
        },
    
        [1] = {
    
            .size = 41,
    
            .price = 95
    
        },
    
    }
    
    int client()
    
    {
    
        int i;
    
        for(i =0; i++; i< ARRAY_SIZE(shop))
    
        {
    
            printf("cap %d size %d", i, shop[i].size);
    
        }
    
        for(i =0; i++; i< ARRAY_SIZE(shop))
    
        {
    
            printf("cap %d price %d", i, shop[i].price);
    
        }
    
    }

    对比两者的代码,可以明显看出,C实现里从来不在用于存放数据的结构体里放函数。也就是说,面向对象里数据的抽象父类提供的getsize子类的方法是不存在的。

    如果想要访问数据,根据数据的组织形式,直接操作就可以。从这个意义上讲,如果C语言实现里想要增加访问方法,根本不用修改数据相关的东西,这个比向对象里还需要修改数据的父类更为纯粹。这个才是更干净的访问者模式,也可以换个角度说,C里面根本不存在访问者模式。

    来源:华为云社区  作者:lurayvis

  • 相关阅读:
    031:verbatim 标签
    030:spaceless和autoescape 标签
    WinForm webbrowser控件的使用
    c# WebBrowser开发参考资料--杂七杂八
    C# Winform WebBrowser控件
    使用webBrowser进行C#和JS通讯
    webBrowser 应用编程函数总结
    C#网页采集数据的几种方式(WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)
    利用WebBrowser控件实现百度自动搜索
    c#winform使用WebBrowser 大全
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165714.html
Copyright © 2020-2023  润新知