云社区 > 云博客 > 博客详情
云社区 > 云博客 > 博客详情

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

lurayvis 发表于 2017-11-20 14:21:4911-20 14:21
lurayvis 发表于 2017-11-20 14:21:4911-20 14:21
132
0
0

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

访问者模式(Visitor)介绍

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

 

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

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

 

          这里变化的因素有两个,不同的帽子和不同的访问方法(pricesize)。解决不同帽子的方法是增加不同的帽子具体类。解决不同的访问方法是不同的具体访问方法子类price_showsize_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里面根本不存在访问者模式


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:huaweicloud.bbs@huawei.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

上一篇:设计模式的C语言应用-非典型模式-第十章

下一篇:设计模式的C语言应用-外观模式-第八章

相关文章


【Free style】设计模式的C语言应用-导言-第一章

【Free style】设计模式的C语言应用-状态机模式-第二章

【free style】设计模式的C语言应用-责任链模式-第三章

【资料合集】设计模式的C语言应用——共十章

云计算在券商中的应用

Javascript设计模式:单例模式

Linux如何设置开机启动应用

基础设施高可用

函数式接口在Jalor3中的应用

理解程序设计语言的类型系统(1)

评论(0)


0/1000
评论

登录后可评论,请 登录注册

评论
温馨提示

您确认删除评论吗?

确定
取消
温馨提示

您确认删除评论吗?

删除操作无法恢复,请谨慎操作。

确定
取消
温馨提示

您确认删除博客吗?

确定
取消

确认删除

您确认删除博客吗?

确认删除

您确认删除评论吗?