您的位置:首页 > 编程语言 > C语言/C++

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

2019-07-16 14:51 1496 查看

访问者模式(Visitor)介绍

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

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

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

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

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

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

[code]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实现的访问者模式

[code]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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: